gpt4 book ai didi

Java GUI 难倒了。 JFrame中只有一个显示

转载 作者:行者123 更新时间:2023-11-29 06:34:48 27 4
gpt4 key购买 nike

我正在尝试创建包含三个 JPanelsJframe。我扩展了 JPanel,这样每次它都可以传递一种颜色和一个直径。最终结果是一个 JFrame,它有 1 个红色、1 个黄色和 1 个绿色 stoplightpanel。我计划在这些面板中添加一个 ActionListener,这就是它以这种方式设计的原因。它不起作用,因为目前我只能看到黄色面板。

公平警告这是一个类。所以我已经尝试了我能想到的每一种配置,但我仍然只看到我的子类的一个实例出现在我的 Jframe 中。如果有人能指出显而易见的地方,我将不胜感激。奇怪的是只显示我的黄灯。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


class TrafficLight3 extends JFrame {

public static void main ( String [] args ) {
TrafficLight3 tl = new TrafficLight3 ( );
}

// Constructor
public TrafficLight3( ) {

setTitle( "Traffic Light" );
setSize ( 200, 400 );
setLocation ( 200, 200 );
setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );

StopLightPanel red = new StopLightPanel( 100, Color.RED );

// add stoplight panel's to JFrame's default border layout.
add( red, BorderLayout.NORTH );

StopLightPanel yellow = new StopLightPanel( 100, Color.YELLOW );
add( yellow, BorderLayout.CENTER );

StopLightPanel green = new StopLightPanel( 100, Color.GREEN );
add ( green, BorderLayout.SOUTH );

setVisible( true );
}
class StopLightPanel extends JPanel {

private int diameter;
private Color color;

public StopLightPanel ( int d, Color c) {

diameter = d;
color = c;
}

public void paintComponent ( Graphics g ) {

g.setColor ( color );
g.fillOval ( 50, 25, diameter, diameter );
}
}
}

最佳答案

1- 确保您的代码在 EDT 中运行

2- @Flight2039 是正确的,似乎位置不是 CENTER 的 BorderLayout 使用 preferredSize 来确定大小。所以你可以覆盖 getPreferredSize()

3- 当您覆盖 paintComponent(..) 时,您必须调用 super.paintComponent(..) 以遵循绘画方法链。更多信息 here .

4- 始终添加 @Override 注释,这将在编译时进行检查,例如,如果您在重写该方法时犯了一些拼写错误。

请看这个可运行的例子,我使用了一列三行的 gridLayout。

package test2;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TrafficLight3 {

private JPanel redPanel;
private JPanel yellowPanel;
private JPanel greenPanel;

// Constructor
public TrafficLight3() {
redPanel = new StopLightPanel(100, Color.RED);
yellowPanel = new StopLightPanel(100, Color.YELLOW);
greenPanel = new StopLightPanel(100, Color.GREEN);
}

private static class StopLightPanel extends JPanel {
private int diameter;
private Color color;

public StopLightPanel(int d, Color c) {
diameter = d;
color = c;
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(50, 25, diameter, diameter);
}

@Override
public Dimension getPreferredSize(){
int x = diameter*2;
return new Dimension(x,x);
}
}

/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Traffic Light");
frame.setSize(200,500);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new GridLayout(3,1));
frame.setLocationByPlatform(Boolean.TRUE);
TrafficLight3 example = new TrafficLight3();
frame.add(example.redPanel);
frame.add(example.yellowPanel);
frame.add(example.greenPanel);
// Display the window.
frame.setVisible(Boolean.TRUE);
}

public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

}

和输出..

enter image description here

关于Java GUI 难倒了。 JFrame中只有一个显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035467/

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