java - 在 Swing Java 中绘图

标签 java swing graphics jpanel paintcomponent

我正在制作“谁是百万富翁”游戏。

这是帮助面板,用户可以选择其中一个选项,例如:调用 friend 、询问观众等。

但我有一个问题,选项是省略号,是在类 Help_Option extends JComponent 中绘制的。当我单独测试这个类 Help_Option 时,它工作正常。但是当我将 Help_Option 对象添加到游戏面板(实际上是框架中的子面板)时,它只在面板上显示一条线,而不会绘制我的椭圆。

这是我的代码:

注意:a是JFrame,我没有复制整个方法initialize(JFrame a),因为它很长,我不认为错误来自那里。

   /******Helper panel**********/
            JPanel help_area_container = new JPanel();

            help_area_container.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3));
            help_area_container.setLayout(new GridLayout(4,0));

                JPanel voting_container = new JPanel();
                JPanel calling_container = new JPanel();
                JPanel half_container = new JPanel();
                JPanel take_container = new JPanel();
                JPanel[] all_help_container = new JPanel[]{voting_container, calling_container, half_container, take_container};
                for(int i = 0; i < all_help_container.length; i++){
                    all_help_container[i].setBorder(BorderFactory.createLineBorder(Color.RED));
                    all_help_container[i].setPreferredSize(new Dimension(350, help_area_container.getPreferredSize().height/4));
                }

                for(int j = 0; j < all_help_container.length; j++){
                    help_area_container.add(all_help_container[j]);
                }

                Help_Option voting_option = new Help_Option(all_help_container[0].getPreferredSize().width, all_help_container[0].getPreferredSize().height);
                voting_option.setPreferredSize(new Dimension(all_help_container[0].getPreferredSize().width, all_help_container[0].getPreferredSize().height));
                all_help_container[0].add(voting_option);

a.add(help_area_container, BorderLayout.EAST);
            /*****************************/

这是 Help_Option 类:

class Help_Option extends JComponent implements MouseMotionListener{
    private static int x, y;
    private Ellipse2D ellipse;
    private Color c = Color.BLACK;    

    public Help_Option(int x, int y){
        Help_Option.x = x;
        Help_Option.y = y;
        ellipse = new Ellipse2D.Double(0, 0, x, y);
        this.addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.BLUE);
        g2d.draw(ellipse);

        g2d.setColor(c);
        g2d.fill(ellipse);        

        g2d.setColor(Color.RED);
        g2d.setFont(new Font("TimesRoman", Font.BOLD, 20));
        g2d.drawString("Here I am", 250, 100);
    }

    public void setColor(Color c){
        this.c = c;
    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        if(ellipse.contains(e.getX(), e.getY())){
            setColor(Color.GREEN);
            repaint();
        }else{
            setColor(Color.BLACK);
            repaint();
        }
    }
}

这是我用来测试 Help_Option 类的类:

public class Help extends JFrame{

    public static void main(String [] agrs){
        Help h = new Help();
        h.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        h.init();
    }

    public void init(){
        this.setLayout(new FlowLayout());
        this.setSize(2000, 1000);

        JPanel a = new JPanel();
        a.setPreferredSize(new Dimension((int)a.getSize().width/3, (int)a.getSize().height/2));
        a.setBorder(BorderFactory.createLineBorder(Color.yellow, 3));
        Help_Option k = new Help_Option(a.getPreferredSize().width, a.getPreferredSize().height/2);
        k.setPreferredSize(new Dimension(a.getPreferredSize().width, a.getPreferredSize().height));
        a.add(k);

        this.add(a);
        this.setVisible(true);
    }
}

编辑

This是我的类(class)的链接,请看一下。错误如上所述。

最佳答案

这是因为您尚未为前几个 JPanel 设置值,它们返回的首选尺寸为 0。尺寸为 0,0

所以您应该向那里的 JPanel 添加值。

public static void main(String[] args) {

    JPanel help_area_container = new JPanel();

    help_area_container.setBorder(BorderFactory.createLineBorder(
            Color.BLUE, 3));
    help_area_container.setLayout(new GridLayout(4, 0));

//Should have set sizes below
    JPanel voting_container = new JPanel();
//voting_container.setSize(50,50);
    JPanel calling_container = new JPanel();
    JPanel half_container = new JPanel();
    JPanel take_container = new JPanel();
    JPanel[] all_help_container = new JPanel[] { voting_container,
            calling_container, half_container, take_container };
    for (int i = 0; i < all_help_container.length; i++) {
        all_help_container[i].setBorder(BorderFactory
                .createLineBorder(Color.RED));
        all_help_container[i].setPreferredSize(new Dimension(350,
                help_area_container.getPreferredSize().height / 4));
    }

    for (int i = 0; i < all_help_container.length; i++) {

        System.out.println(all_help_container[i].getSize());

    }

}

// where you can change the size
    all_help_container[0].setSize(50, 50);

    System.out.println("----");

    for (int i = 0; i < all_help_container.length; i++) {

        System.out.println(all_help_container[i].getSize());

    }
}

希望这能帮助您调整 GUI 的大小。 您必须调整不同的面板以满足您的需求。我猜测这个面板中还会包含一些其他内容。

您可能希望为每个面板创建自定义 JPanel,以便您可以轻松检查它们的尺寸是否合适。

public class VotingPanel extends JPanel {

    public VotingPanel(){

      //All your variables such as size and color schemes

    }
}

关于java - 在 Swing Java 中绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23095631/

相关文章:

java - 通过鼠标点击随机改变矩形的颜色

java - InputMap - 注册一个监控按键的击键,没有虚拟重复

r - 多页格子面板排列

rust - 使用泛型重新导出结构

java - 重新绘制时特定对象闪烁

java - 从 hibernate session 中删除对象?

java - 使用 Lucene 6 提取英语单词

java - 似乎无法让 Eclipse IDE 在我的 Mac 上找到 geckodriver

Java 说 XML 文档格式不正确

JavaFX 与 Java Swing 在行业中的使用