在Java中绘制

时间:2014-04-15 22:21:57

标签: java swing graphics jpanel paintcomponent

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

这是帮助面板,让用户可以选择以下选项之一:呼叫朋友,询问观众等。

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

这是我的代码:

注意:a是JFrame,我不复制整个方法初始化(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是我课程的链接,请查看它们。错误如上所述。

1 个答案:

答案 0 :(得分:1)

您无法为前几个JPanel设置值,并且返回的首选大小为0.尺寸为0,0

所以你应该在那里为JPanels添加值。

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

    }
}