Java 在添加到另一个JPanel的JPanel中不显示图形
将带有图形的Java 在添加到另一个JPanel的JPanel中不显示图形,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,将带有图形的JPanel添加到JFrame时,它工作正常。但是当我尝试添加一个JPanel时,我在其中添加了另一个带有图形的JPanel,它不会显示在JFrame中。请参阅下面的代码 package sample; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JFrame
JPanel
添加到JFrame
时,它工作正常。但是当我尝试添加一个JPanel
时,我在其中添加了另一个带有图形的JPanel
,它不会显示在JFrame
中。请参阅下面的代码
package sample;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame{
public static void main(String[] args) {
new Main();
}
public Main(){
setTitle("Sample");
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new SamplePanel2());
}
}
class SamplePanel2 extends JPanel{
public SamplePanel2(){
add(new JButton("Hi"));
add(new SamplePanel());
}
}
class SamplePanel extends JPanel {
public SamplePanel(){
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("HHHHHHHHHHHH", 100, 100);
}
}
请注意
Main
类的构造器,使其成为您遵循本例所示顺序的习惯。首先将组件添加到JFrame
,然后只调用pack()、setSize()或setVisible(…)
,而不是在此之前
始终使其成为您的习惯,即每当您重写paintcomponent()
方法时,也要重写getPreferredSize()
方法
并始终将类似于pack()/setVisible(…)
的调用放在EDT-Event分派线程中。请阅读,了解更多有关该主题的详细信息
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame{
public static void main(String[] args) {
new Main();
}
public Main(){
setTitle("Sample");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new SamplePanel2());
pack();
setVisible(true);
}
}
class SamplePanel2 extends JPanel{
public SamplePanel2(){
add(new JButton("Hi"));
add(new SamplePanel());
}
}
class SamplePanel extends JPanel {
public SamplePanel(){
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("HHHHHHHHHHHH", 100, 100);
}
}
请注意
Main
类的构造器,使其成为您遵循本例所示顺序的习惯。首先将组件添加到JFrame
,然后只调用pack()、setSize()或setVisible(…)
,而不是在此之前
始终使其成为您的习惯,即每当您重写paintcomponent()
方法时,也要重写getPreferredSize()
方法
并始终将类似于pack()/setVisible(…)
的调用放在EDT-Event分派线程中。请阅读,了解更多有关该主题的详细信息
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame{
public static void main(String[] args) {
new Main();
}
public Main(){
setTitle("Sample");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new SamplePanel2());
pack();
setVisible(true);
}
}
class SamplePanel2 extends JPanel{
public SamplePanel2(){
add(new JButton("Hi"));
add(new SamplePanel());
}
}
class SamplePanel extends JPanel {
public SamplePanel(){
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("HHHHHHHHHHHH", 100, 100);
}
}
只需重写并使其返回一些值,如
returnnewdimension(300300)
,在您的SamplePanel类中
请参阅stackoverflow上的“如何将JPanel类添加到netbeans中的JFrame表单类中?”了解更多信息info@MaVRoSCy:伙计,你只是忘了放评论的链接,比如为了在这里放评论,在这里放方括号[],比如[here],后面是括号,比如[here]()然后在括号内粘贴URL。只需重写并使其返回一些值,如returnnewdimension(300300)
,在您的SamplePanel类中
请参阅stackoverflow上的“如何将JPanel类添加到netbeans中的JFrame表单类中?”了解更多信息info@MaVRoSCy:伙计,你只是忘了放评论的链接,比如为了在这里放评论,在这里放方括号[],比如[here],后面是括号,比如[here]()在括号内粘贴URL。@user1508907:注意JPanel
的默认布局是。非常欢迎您并保持微笑:-)@user1508907:注意JPanel
的默认布局是。非常欢迎您并保持微笑:-)