gpt4 book ai didi

java - JComponent 不可见,有人知道为什么吗?

转载 作者:行者123 更新时间:2023-11-29 04:02:50 25 4
gpt4 key购买 nike

这是我的 JFrame 代码:

public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setSize(600,600);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

MyCustomWidget widget = MyCustomWidget.createWidget(400, 400);
widget.setVisible(true);
// just to set x and y
widget.setLocation(40, 40);

jf.getContentPane().add(widget);
jf.setVisible(true);
}

这是 MyCustomWidget 的代码:

public class MyCustomWidget extends JComponent {

public void paint(Graphics g)
{
super.paint(g);
}

public static MyCustomWidget createWidget(int width,int height)
{
MyCustomWidget tw = new MyCustomWidget();
tw.setBounds(0,0,width,height);
tw.setBackground(Color.RED);
return tw;
}
}

问题是,JComponent 没有显示在窗口中,我不明白为什么。我什至添加了一个 widget.setVisible(true) 只是为了确保它可见。什么都不管用。你能发现我做错了什么吗?

在你们建议的修改之后,现在的代码是:

打包javaapplication2;

public class Main {

public static void main(String[] args) throws IOException {

SwingUtilities.invokeLater(new Runnable() {

public void run() {
JFrame jf = new JFrame();
jf.setSize(600,600);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLayout(null);

JComponent container = (JComponent) jf.getContentPane();
container.setDebugGraphicsOptions(DebugGraphics.FLASH_OPTION);
DebugGraphics.setFlashColor(Color.RED);
DebugGraphics.setFlashCount(2);
DebugGraphics.setFlashTime(100);

MyCustomWidget widget = MyCustomWidget.createTimeline(400, 400);

container.add(widget);
jf.setVisible(true);
}

});


}

}

和:

public class MyCustomWidget extends JComponent {

public void paintComponent(Graphics g)
{
setForeground(Color.BLACK);
drawLines(g);
}

// a little something to see that something is drawed
private void drawLines(Graphics g)
{
int distanceBetween = getHeight() / numberOfLines;
int start = 0;
int colourIndex = 0;
Color colours[] = {Color.BLUE,Color.WHITE,Color.YELLOW};

for(int i = 0;i < distanceBetween;start+=distanceBetween,i++)
{
g.setColor(colours[colourIndex]);
g.drawLine(0,start,40,40);
colourIndex %= colours.length;
}
}

private int numberOfLines = 4;

public MyCustomWidget()
{
setOpaque(true);
}

public static MyCustomWidget createTimeline(int width,int height)
{
MyCustomWidget tw = new TimelineWidget();
tw.setBounds(0,0,width,height);
return tw;
}
}

最佳答案

这是这里发生的事情:

  • JFrame 内容 Pane 的默认布局是 BorderLayout。这意味着您的组件的大小已调整为内容 Pane 的整个大小。要在添加组件之前在任何地方修复此问题,请执行
 jf.getContentPane().setLayout(null);
  • 背景不会在 JComponent 的直接后代中自动绘制。您可以使您的组件不透明 (setOpaque(true)),从 JPanel 扩展或像这样重写 paintComponent 方法
 public void paintComponent (Graphics g) {
super.paintComponent (g);
g.setColor(getBackground());
g.drawRect(0, 0, getWidth(), getHeight());
}

编辑:

为了遵守 Swing 线程规则,main 方法中的代码应该在 EDT 线程上运行。这意味着它必须被包装成

SwingUtilities.invokeLater(new Runnable() {
public void run() {
// your code goes here
}
}

关于java - JComponent 不可见,有人知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2298887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com