Итак, у меня есть программа, которая использует jframe и jpanel и тому подобное. У меня есть несколько JPanels с JTextAreAs, как список. Я пытаюсь создать jscrollpane, который позволяет мне прокручивать все JPanels, сверху вниз. Для этого я пытаюсь получить высоту всех JPanels + пространства между ними (которые 55 ... пикселей?). Однако при использовании функции jpanel.getheight () он дает мне высоту JPanel без дополнительной линейной обертки. Почему это?package groupid;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.json.simple.JSONObject;
import org.junit.internal.TextListener;
public class UserInterface {
//Sort Options - Different Ways to Short Data
static String sortOptions[] = {"A - Z","Z - A","Recently Created","Oldest Created","Recently Modified"};
//Main Frame Components
static ImageIcon icon;
static JFrame mainFrame = new JFrame();
static JPanel mainPanel;
static JScrollPane mainScrollPane;
//Main Panel Components
static JPanel rightPanel;
static JPanel sidePanel;
//Right Panel Components
static JPanel topPanel;
static JPanel searchPanel;
static JLabel searchLabel;
static JTextField searchBar;
static String searchText;
static JPanel sortPanel;
static JLabel sortByLabel;
static JPanel bottomPanel;
static JPanel addButtonPanel;
static JButton addButton;
static JPanel flowPanel;
static JPanel footerPanel;
static JPanel titlePanel;
static JLabel titleLabel;
static JPanel heightPanel;
static JTextArea valueLabel;
static String clipboardString;
static Boolean pasteBool;
static Boolean startUp;
public static void main(String[] args) {
Database.startUp();
UserInterface.jFrameCreate();
}
static Action paste = new AbstractAction("Paste") {
@Override
public void actionPerformed(ActionEvent e) {
try {
clipboardString = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException | IOException e1) {
e1.printStackTrace();
}
pasteBool = true;
new AddToClippyBoard();
pasteBool = false;
}
};
public static void jFrameCreate(){
startUp = true;
mainFrame.setVisible(true);
mainFrame.setSize(1600, 900);
mainFrame.setTitle("ClippyBoards");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setResizable(true);
mainFrame.setFocusable(true);
mainFrame.setLayout(new BorderLayout(10,0));
mainFrame.addWindowListener(new WindowAdapter() { // Exits out of application
@Override
public void windowClosing(WindowEvent e) {
Database.saveFile();
mainFrame.dispose();
}
});
icon = new ImageIcon("EggSMP.png");
mainFrame.setIconImage(icon.getImage());
mainFrame.getContentPane().setBackground(new Color(100,100,100));
// Right Panel - Panel that holds bottom panel and main panel
rightPanel = new JPanel(new BorderLayout(5,5));
rightPanel.setBackground(new Color(150,150,150));
rightPanel.setPreferredSize(new Dimension(1200,500));
mainFrame.add(rightPanel,BorderLayout.CENTER);
mainPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,20,20));
mainPanel.setPreferredSize(new Dimension(1000,0));
mainPanel.setBackground(new Color(230,230,230));
mainScrollPane = new JScrollPane(mainPanel);
mainScrollPane.createVerticalScrollBar();
mainScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
mainScrollPane.getVerticalScrollBar().setUnitIncrement(20);
rightPanel.add(mainScrollPane); // adds mainPanel, with scroll bar
KeyStroke ctrlV = KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_DOWN_MASK);
mainPanel.getActionMap().put("Paste", paste);
mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlV, "Paste");;
// Side Panel - Navigate and organize folders
sidePanel = new JPanel(new FlowLayout());
sidePanel.setPreferredSize(new Dimension(500,100));
sidePanel.setBackground(new Color(220,228,232));
mainFrame.add(sidePanel,BorderLayout.WEST);
//Top Panel - Search Bar & Sorting Options
topPanel = new JPanel(new BorderLayout());
topPanel.setPreferredSize(new Dimension(1000,50));
topPanel.setBackground(new Color(230,230,230));
rightPanel.add(topPanel,BorderLayout.NORTH);
//Search Panel - Holds Search Bar
searchPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING,5,12));
searchPanel.setPreferredSize(new Dimension(500,50));
searchPanel.setBackground(new Color(230,230,230));
topPanel.add(searchPanel,BorderLayout.EAST);
//Search Label
searchLabel = new JLabel();
searchLabel.setFont(new Font("Arial",Font.BOLD,20));
searchLabel.setText("Search:");
searchPanel.add(searchLabel);
//Search Bar - Search for Items within
searchBar = new JTextField();
searchBar.setPreferredSize(new Dimension(250,30));
searchBar.setBackground(new Color(250,250,250));
searchBar.setFont(new Font("Arial",Font.PLAIN,20));
searchBar.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
jFrameRefresh();
searchText = searchBar.getText();
}
@Override
public void insertUpdate(DocumentEvent e) {
jFrameRefresh();
searchText = searchBar.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
jFrameRefresh();
searchText = searchBar.getText();
}
});
searchPanel.add(searchBar);
//Sort Panel - Holds Sort Filter
sortPanel = new JPanel(new FlowLayout(FlowLayout.LEADING,5,12));
sortPanel.setPreferredSize(new Dimension(600,50));
sortPanel.setBackground(new Color(230,230,230));
topPanel.add(sortPanel,BorderLayout.WEST);
//Sort Label
icon = new ImageIcon(new ImageIcon("SortBlack.png").getImage().getScaledInstance(30, 30, Image.SCALE_DEFAULT));
sortByLabel = new JLabel();
sortByLabel.setFont(new Font("Arial",Font.BOLD,20));
sortByLabel.setText("Sort By:");
sortByLabel.setIcon(icon);
sortPanel.add(sortByLabel);
//sort Filter - Sorts data by selected filter
JComboBox sortBy = new JComboBox(sortOptions);
sortBy.setPreferredSize(new Dimension(200,30));
sortBy.setFont(new Font("Arial",Font.PLAIN,20));
sortPanel.add(sortBy);
// Bottom Panel - Undecided
bottomPanel = new JPanel(new BorderLayout());
bottomPanel.setPreferredSize(new Dimension(100,50));
bottomPanel.setBackground(new Color(220,228,232));
rightPanel.add(bottomPanel,BorderLayout.SOUTH);
// Button Panel - Holds Add Button
addButtonPanel = new JPanel();
addButtonPanel.setPreferredSize(new Dimension(50,50));
addButtonPanel.setBackground(new Color(220,228,232));
bottomPanel.add(addButtonPanel,BorderLayout.EAST);
// Add Button - Will open window to import new info
addButton = new JButton("+");
addButton.setFont(new Font("Arial",Font.BOLD,20));
addButton.setAlignmentX(JPanel.CENTER_ALIGNMENT);
addButton.setAlignmentY(JPanel.CENTER_ALIGNMENT);
addButtonPanel.add(addButton);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==addButton) {
pasteBool = false;
new AddToClippyBoard();
}
}
});
startUp = false;
jFrameRefresh();
}
public static void jFrameRefresh() {
mainPanel.removeAll();
loadClippy();
System.out.println("repaint");
mainFrame.revalidate();
mainFrame.repaint();
}
public static void loadClippy() {
int mainPanelSize = 0;
for (int i = 0; i < Database.jsonArray.size(); i++) {
JSONObject tempObject = (JSONObject) Database.jsonArray.get(i);;
flowPanel = new JPanel(new BorderLayout());
flowPanel.setBackground(new Color(220,220,220));
mainPanel.add(flowPanel);
footerPanel = new JPanel();
footerPanel.setPreferredSize(new Dimension(1000,5));
footerPanel.setBackground(new Color(220,220,220));
flowPanel.add(footerPanel,BorderLayout.SOUTH);
titlePanel = new JPanel(new BorderLayout());
titlePanel.setPreferredSize(new Dimension(1000,50));
titlePanel.setBackground(new Color(220,220,220));
flowPanel.add(titlePanel,BorderLayout.NORTH);
titleLabel = new JLabel();
titleLabel.setFont(new Font("Arial",Font.BOLD,25));
titleLabel.setText(tempObject.get("name").toString());
titlePanel.add(titleLabel);
heightPanel = new JPanel();
heightPanel.setBackground(new Color(0,0,220));
flowPanel.add(heightPanel,BorderLayout.EAST);
valueLabel = new JTextArea();
valueLabel.setFont(new Font("Arial",Font.PLAIN,15));
valueLabel.setBackground(new Color(220,220,220));
valueLabel.setLineWrap(true);
valueLabel.setWrapStyleWord(true);
valueLabel.setEditable(false);
valueLabel.setText(tempObject.get("value").toString());
flowPanel.add(valueLabel);
mainFrame.revalidate();
mainFrame.repaint();
System.out.println(heightPanel.getHeight());
mainPanelSize += 55+heightPanel.getHeight();
}
mainPanel.setPreferredSize(new Dimension(1000,mainPanelSize));
}
}
< /code>
Для той части, над которой я работаю, ищите «public static void LoadClippy». Это решается, и не проблема < /p>
Я пробовал два метода: < /strong> < /h3>
Просто с использованием jpanel.getsize (). Getheight (). Не включал линейную упаковку, просто высоту всего, как будто не было линейной упаковки < /p>
< /li>
думал, что я гениоз, когда придумал идею добавления суб-Jpanel в восточную сторону, чтобы я мог получить высоту этого права? Каким -то образом, даже если они имеют разные высоты на экране, они выводят одну и ту же Getheight () < /p>
< /li>
< /ol>
Вот как он выглядит:
Странные синие линии справа от каждой JPanel - моя высокая панель. Они имеют разные высоты для наших глаз, но они печатают одни и те же значения, если у них есть линейные обертывания
system.out.println ()
Подробнее здесь: https://stackoverflow.com/questions/769 ... s-intended