英文:
JPanels added to another JPanel (in a JFrame) not showing up
问题
// 以下为翻译内容:
// 创建主面板和窗口的代码;
MainPanel mPanel = new MainPanel(tempTheme, phrases);
mPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
mPanel.setLayout(new BorderLayout(0, 0));
JFrame frame = new JFrame("Staines Counter v" + version);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(iconImagePath));
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setSize(new Dimension(1000, 900));
frame.setBackground(tempTheme.getBackground());
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
frame.setContentPane(mPanel);
frame.setLayout(new BorderLayout(0, 0));
frame.setVisible(true);
frame.requestFocus();
// 主面板代码;
public void init() {
// 文本区域
textArea = new JTextArea();
textArea.setFont(new Font("Dialog", Font.PLAIN, 14));
textArea.setRows(20);
textArea.setWrapStyleWord(true);
textArea.setForeground(TEXT_COLOR_FOREGROUND);
textArea.setBackground(TEXT_COLOR_BACKGROUND);
textArea.setEditable(false);
textArea.setLineWrap(true);
// 按钮
buttons = new ArrayList<>();
for (Phrase p : phrases) {
CustomButton temp = new CustomButton(p);
temp.setBackground(BUTTON_COLOR_BACKGROUND);
temp.setForeground(BUTTON_COLOR_FOREGROUND);
temp.addActionListener(new CustomActionListener(this, temp, textArea));
buttons.add(temp);
}
copyButton = new JButton("Copy Text");
copyButton.setForeground(BUTTON_COLOR_FOREGROUND);
copyButton.setBackground(BUTTON_COLOR_BACKGROUND);
copyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
copyAction();
}
});
reportButton = new JButton("Get Report");
reportButton.setForeground(BUTTON_COLOR_FOREGROUND);
reportButton.setBackground(BUTTON_COLOR_BACKGROUND);
reportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reportAction();
}
});
settingsButton = new JButton("");
settingsButton.setForeground(BACKGROUND_COLOR);
settingsButton.setBackground(BACKGROUND_COLOR);
settingsButton.setIcon(new ImageIcon("src/main/resources/settings.png"));
settingsButton.setBounds(80, 0, 35, 35);
settingsButton.setToolTipText("Settings");
settingsButton.setBorderPainted(false);
settingsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsAction();
}
});
saveButton = new JButton("Save");
saveButton.setForeground(BUTTON_COLOR_FOREGROUND);
saveButton.setBackground(BUTTON_COLOR_BACKGROUND);
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveAction();
}
});
// 面板
topPanel = new JPanel();
topPanel.setBackground(BACKGROUND_COLOR);
topPanel.setLayout(new GridLayout(0, 3, 10, 10));
for (CustomButton b : buttons) {
topPanel.add(b);
}
middlePanel = new JPanel();
middlePanel.setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, 10),
new LineBorder(BACKGROUND_COLOR)));
middlePanel.setBackground(BACKGROUND_COLOR);
middlePanel.setLayout(new CardLayout(10, 10));
middlePanel.add(textArea);
bottomLeftPanel = new JPanel();
bottomLeftPanel.setBackground(BACKGROUND_COLOR);
bottomLeftPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 25, 0));
bottomLeftPanel.add(copyButton);
bottomLeftPanel.add(reportButton);
bottomLeftPanel.add(saveButton);
bottomRightPanel = new JPanel();
bottomRightPanel.setBackground(BACKGROUND_COLOR);
bottomRightPanel.setLayout(null);
bottomRightPanel.add(settingsButton);
bottomPanel = new JPanel();
bottomPanel.setBackground(BACKGROUND_COLOR);
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));
bottomPanel.add(bottomLeftPanel);
bottomPanel.add(bottomRightPanel);
add(topPanel, BorderLayout.NORTH);
add(middlePanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
}
英文:
So I have a custom JPanel with BorderLayout with other JPanels inside. The Main JPanel is added to a JFrame with a null layout. The JPanels inside the Main JPanel are not showing up unless I specify a size even though it is BorderLayout. I tried changing the BorderLayout to other layouts but they still do not show up.
Code creating Main JPanel and JFrame;
MainPanel mPanel = new MainPanel(tempTheme, phrases);
mPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
mPanel.setLayout(new BorderLayout(0, 0));
JFrame frame = new JFrame("Staines Counter v" + version);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(iconImagePath));
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setSize(new Dimension(1000, 900));
frame.setBackground(tempTheme.getBackground());
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
frame.setContentPane(mPanel);
frame.setLayout(new BorderLayout(0, 0));
frame.setVisible(true);
frame.requestFocus();
Main JPanel;
public void init() {
//Text Area
textArea = new JTextArea();
textArea.setFont(new Font("Dialog", Font.PLAIN, 14));
textArea.setRows(20);
textArea.setWrapStyleWord(true);
textArea.setForeground(TEXT_COLOR_FOREGROUND);
textArea.setBackground(TEXT_COLOR_BACKGROUND);
textArea.setEditable(false);
textArea.setLineWrap(true);
//Buttons
buttons = new ArrayList<>();
for (Phrase p : phrases) {
CustomButton temp = new CustomButton(p);
temp.setBackground(BUTTON_COLOR_BACKGROUND);
temp.setForeground(BUTTON_COLOR_FOREGROUND);
temp.addActionListener(new CustomActionListener(this, temp, textArea));
buttons.add(temp);
}
copyButton = new JButton("Copy Text");
copyButton.setForeground(BUTTON_COLOR_FOREGROUND);
copyButton.setBackground(BUTTON_COLOR_BACKGROUND);
copyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
copyAction();
}
});
reportButton = new JButton("Get Report");
reportButton.setForeground(BUTTON_COLOR_FOREGROUND);
reportButton.setBackground(BUTTON_COLOR_BACKGROUND);
reportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reportAction();
}
});
settingsButton = new JButton("");
settingsButton.setForeground(BACKGROUND_COLOR);
settingsButton.setBackground(BACKGROUND_COLOR);
settingsButton.setIcon(new ImageIcon("src/main/resources/settings.png"));
settingsButton.setBounds(80, 0, 35, 35);
settingsButton.setToolTipText("Settings");
settingsButton.setBorderPainted(false);
settingsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsAction();
}
});
saveButton = new JButton("Save");
saveButton.setForeground(BUTTON_COLOR_FOREGROUND);
saveButton.setBackground(BUTTON_COLOR_BACKGROUND);
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveAction();
}
});
//Panels
topPanel = new JPanel();
topPanel.setBackground(BACKGROUND_COLOR);
topPanel.setLayout(new GridLayout(0, 3, 10, 10));
//topPanel.setSize(300, 400);
for (CustomButton b : buttons) {
topPanel.add(b);
}
middlePanel = new JPanel();
middlePanel.setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, 10),
new LineBorder(BACKGROUND_COLOR)));
middlePanel.setBackground(BACKGROUND_COLOR);
middlePanel.setLayout(new CardLayout(10, 10));
middlePanel.add(textArea);
bottomLeftPanel = new JPanel();
bottomLeftPanel.setBackground(BACKGROUND_COLOR);
bottomLeftPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 25, 0));
bottomLeftPanel.add(copyButton);
bottomLeftPanel.add(reportButton);
bottomLeftPanel.add(saveButton);
bottomRightPanel = new JPanel();
bottomRightPanel.setBackground(BACKGROUND_COLOR);
bottomRightPanel.setLayout(null);
bottomRightPanel.add(settingsButton);
bottomPanel = new JPanel();
bottomPanel.setBackground(BACKGROUND_COLOR);
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));
bottomPanel.add(bottomLeftPanel);
bottomPanel.add(bottomRightPanel);
add(topPanel, BorderLayout.NORTH);
add(middlePanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
}
答案1
得分: 0
MainPanel mPanel = new MainPanel(tempTheme, phrases);
mPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
mPanel.setLayout(new BorderLayout(0, 0));
在你的类构造函数中添加组件到面板之前,你需要在构造函数中设置布局。
add(topPanel, BorderLayout.NORTH);
add(middlePanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
这些约束条件无意义,因为在执行这些语句时,布局管理器尚未设置。
英文:
MainPanel mPanel = new MainPanel(tempTheme, phrases);
mPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
mPanel.setLayout(new BorderLayout(0, 0));
You need to set the layout in the constructor of your class BEFORE you add components to the panel.
add(topPanel, BorderLayout.NORTH);
add(middlePanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
Those constraints mean nothing, since at the time the statements are executed the layout manager has not been set.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论