添加的 JPanel 仅在从不同方法添加时显示?
The added JPanel only shows up when added from a different method?
我正在尝试创建一个首先添加 JPanel 行的程序。添加 JPanel 后,您可以通过单击 "Add Horizontal" 并指定要添加方块的行索引(从 0 开始)来添加方块。
我正在尝试添加我的 JPanel
其中一个已添加的方块。
然而,第一个方块并没有出现。当我添加另一个方块时,就好像方块在那里,但只是看不见。
您可以在附图中看到这方面的演示,其中索引 2 和索引 3 的第一个方块完全不可见,没有添加 JLabel
。
如何修改我的代码,以便在单击 "Add Vertical" JButton
后立即显示第一个方块?
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
public class HistoryEditor extends JFrame{
public static Color randomColor(){
return new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
}
public HistoryEditor(){
setLayout(new BorderLayout());
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JPanel controlPanel = new JPanel(new FlowLayout());
final JTextField tf = new JTextField(20);
JButton addVertical = new JButton("Add Vertical");
JButton addHorizontal = new JButton("Add Horizontal");
JButton removeVertical = new JButton("Remove Vertical");
addVertical.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JPanel newPanel = new JPanel();
newPanel.setPreferredSize( new Dimension(getWidth(), 50) );
newPanel.setMaximumSize( newPanel.getPreferredSize() );
newPanel.setMinimumSize( newPanel.getPreferredSize() );
newPanel.setBackground( HistoryEditor.randomColor() );
newPanel.setLayout( new BoxLayout( newPanel, BoxLayout.X_AXIS ) );
JPanel eventPanel = new JPanel();
eventPanel.setBackground( HistoryEditor.randomColor() );
eventPanel.setMaximumSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.setMinimumSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.setPreferredSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.add( new JLabel( tf.getText() ) );
eventPanel.revalidate();
newPanel.add(eventPanel);
newPanel.revalidate();
mainPanel.add( newPanel );
mainPanel.revalidate();
mainPanel.repaint();
eventPanel.repaint();
}
});
addHorizontal.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
int index = Integer.parseInt(tf.getText());
JPanel selectedPanel = (JPanel)mainPanel.getComponent( index );
JPanel eventPanel = new JPanel();
eventPanel.setBackground( HistoryEditor.randomColor() );
eventPanel.setMaximumSize(new Dimension(50, selectedPanel.getHeight()));
eventPanel.setMinimumSize(new Dimension(50, selectedPanel.getHeight()));
eventPanel.add( new JLabel( tf.getText() ) );
selectedPanel.add(eventPanel);
selectedPanel.revalidate();
selectedPanel.repaint();
}catch(Exception ex){}
}
});
removeVertical.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
int index = Integer.parseInt(tf.getText());
mainPanel.remove(index);
mainPanel.revalidate();
mainPanel.repaint();
}catch(Exception ex){}
}
});
controlPanel.add(tf);
controlPanel.add(addVertical);
controlPanel.add(addHorizontal);
controlPanel.add(removeVertical);
add(mainPanel, BorderLayout.CENTER);
add(controlPanel, BorderLayout.SOUTH);
setSize(1000, 1000);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[]args){
HistoryEditor he = new HistoryEditor();
}
}
eventPanel.setPreferredSize( new Dimension(50, newPanel.getHeight() ) );
组件创建时的大小为 (0, 0)。
因此您将 eventPanel 的首选大小设置为 (50, 0),这意味着添加的组件不会被看到,因为面板的高度为 0。
您只需要主面板上的 revalidate()
和 repaint()
。这将导致调用布局管理器并重新绘制 mainPanel 的所有子组件。
另外,也不需要eventPanel。您可以直接将标签添加到 newPanel 中。您只需要确保使用:
label.setOpaque(true);
因此标签的背景将被绘制。
当您使用标签时,无需设置 maximum/minimum 大小,因为它们等于首选大小。
我正在尝试添加我的 JPanel
其中一个已添加的方块。
然而,第一个方块并没有出现。当我添加另一个方块时,就好像方块在那里,但只是看不见。
您可以在附图中看到这方面的演示,其中索引 2 和索引 3 的第一个方块完全不可见,没有添加 JLabel
。
如何修改我的代码,以便在单击 "Add Vertical" JButton
后立即显示第一个方块?
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
public class HistoryEditor extends JFrame{
public static Color randomColor(){
return new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
}
public HistoryEditor(){
setLayout(new BorderLayout());
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JPanel controlPanel = new JPanel(new FlowLayout());
final JTextField tf = new JTextField(20);
JButton addVertical = new JButton("Add Vertical");
JButton addHorizontal = new JButton("Add Horizontal");
JButton removeVertical = new JButton("Remove Vertical");
addVertical.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JPanel newPanel = new JPanel();
newPanel.setPreferredSize( new Dimension(getWidth(), 50) );
newPanel.setMaximumSize( newPanel.getPreferredSize() );
newPanel.setMinimumSize( newPanel.getPreferredSize() );
newPanel.setBackground( HistoryEditor.randomColor() );
newPanel.setLayout( new BoxLayout( newPanel, BoxLayout.X_AXIS ) );
JPanel eventPanel = new JPanel();
eventPanel.setBackground( HistoryEditor.randomColor() );
eventPanel.setMaximumSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.setMinimumSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.setPreferredSize( new Dimension(50, newPanel.getHeight() ) );
eventPanel.add( new JLabel( tf.getText() ) );
eventPanel.revalidate();
newPanel.add(eventPanel);
newPanel.revalidate();
mainPanel.add( newPanel );
mainPanel.revalidate();
mainPanel.repaint();
eventPanel.repaint();
}
});
addHorizontal.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
int index = Integer.parseInt(tf.getText());
JPanel selectedPanel = (JPanel)mainPanel.getComponent( index );
JPanel eventPanel = new JPanel();
eventPanel.setBackground( HistoryEditor.randomColor() );
eventPanel.setMaximumSize(new Dimension(50, selectedPanel.getHeight()));
eventPanel.setMinimumSize(new Dimension(50, selectedPanel.getHeight()));
eventPanel.add( new JLabel( tf.getText() ) );
selectedPanel.add(eventPanel);
selectedPanel.revalidate();
selectedPanel.repaint();
}catch(Exception ex){}
}
});
removeVertical.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
int index = Integer.parseInt(tf.getText());
mainPanel.remove(index);
mainPanel.revalidate();
mainPanel.repaint();
}catch(Exception ex){}
}
});
controlPanel.add(tf);
controlPanel.add(addVertical);
controlPanel.add(addHorizontal);
controlPanel.add(removeVertical);
add(mainPanel, BorderLayout.CENTER);
add(controlPanel, BorderLayout.SOUTH);
setSize(1000, 1000);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[]args){
HistoryEditor he = new HistoryEditor();
}
}
eventPanel.setPreferredSize( new Dimension(50, newPanel.getHeight() ) );
组件创建时的大小为 (0, 0)。
因此您将 eventPanel 的首选大小设置为 (50, 0),这意味着添加的组件不会被看到,因为面板的高度为 0。
您只需要主面板上的 revalidate()
和 repaint()
。这将导致调用布局管理器并重新绘制 mainPanel 的所有子组件。
另外,也不需要eventPanel。您可以直接将标签添加到 newPanel 中。您只需要确保使用:
label.setOpaque(true);
因此标签的背景将被绘制。
当您使用标签时,无需设置 maximum/minimum 大小,因为它们等于首选大小。