我在通过Frame
到JButton
上画一条简单的线时遇到了一些问题。
仅当我使用JButton
执行此操作时,才会出现问题。
如果我直接在JPanel
中使用Frame
,一切正常。
JFrame
:
import javax.swing.*;
import java.awt.*;
public class Fenetre extends JFrame {
public Fenetre(){
super("Test");
init();
pack();
setSize(200,200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void init() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton button = new JButton("Draw line");
button.addActionListener((e)->{
Pane s = new Pane();
panel.add(s);
s.repaint();
});
panel.setBackground(new Color(149,222,205));
add(button,BorderLayout.SOUTH);
add(panel,BorderLayout.CENTER);
}
public static void main(String[] args){
new Fenetre();
}
}
还有JPanel
和paintComponents()
:
import javax.swing.*;
import java.awt.*;
public class Pane extends JPanel {
public void paintComponents(Graphics g){
super.paintComponents(g);
g.drawLine(0,20,100,20);
}
}
答案 0 :(得分:1)
许多问题立即引起我的注意:
paintComponent
,而不是paintComponents
(请注意结尾处的s
),因为您在绘画链中的位置太高了。也不需要将任何一个方法设为public
,类之外的任何人都不应调用它。Pane
没有提供大小提示,因此其“默认”大小为0x0
相反,它看起来应该更像...
public class Pane extends JPanel {
public Dimension getPreferredSize() {
return new Dimension(100, 40);
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawLine(0,20,100,20);
}
}
添加组件时,Swing是惰性的。除非必须或您要求,否则它不会运行布局/绘画过程。这是一种优化,因为您可能需要执行布局传递之前添加许多组件。
要请求通过布局,请在您已更新的顶级容器上调用revalidate
。根据一般经验,如果您致电revalidate
,也应该致电repaint
来申请新的绘画通行证。
public class Fenetre extends JFrame {
public Fenetre(){
super("Test");
init();
//pack();
setSize(200,200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void init() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton button = new JButton("Draw line");
button.addActionListener((e)->{
Pane s = new Pane();
panel.add(s);
panel.revalidate();
panel.repaint();
//s.repaint();
});
panel.setBackground(new Color(149,222,205));
add(button,BorderLayout.SOUTH);
add(panel,BorderLayout.CENTER);
}
public static void main(String[] args){
new Fenetre();
}
}
至少应该让您的panel
现在出现