指定Swing中Canvas的位置

问题描述 投票:0回答:2

我正在学习 Swing GUI 设计。我还没有完全解决的一件事是,如何添加

Canvas
到容器中的特定位置。

更具体地说:我创建了一个使用

Canvas
方法的
paint
类。此类的对象被添加到
JPanel

我不太明白的是,它如何以及在哪里添加到

JPanel
。在 Tkinter 中,
Canvas
是一个仅包含图像的小部件,但在 Swing 中,没有类似的小部件(可能不是最好的词)添加到仅包含
JFrame
对象而没有其他内容的
Canvas

我正在添加一个独立的代码。请忽略文本字段和标签。

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;

//frame class
class frame_class2 extends JFrame implements ActionListener{
  //declare buttons
  JButton draw_button = new JButton("Draw");
  JButton quit_button= new JButton("Quit");
  JButton info_button = new JButton("Info");
  //declare labels
  JLabel x_loc = new JLabel("X:");
  JLabel y_loc = new JLabel("Y:");
  JLabel w_label= new JLabel("Width:");
  JLabel h_label = new JLabel("Height:");
  //Layout
  FlowLayout layout_frame1 = new FlowLayout();
  //Text boxes
  JTextField x_loc_box = new JTextField("0");
  JTextField y_loc_box = new JTextField("0");
  JTextField w_loc_box = new JTextField("100");
  JTextField h_loc_box = new JTextField("100");
  //Info 
  JOptionPane info1 = new JOptionPane();
  //Canvas
  //Canvas area1 = new Canvas();
  //Containers
  JPanel panel1 = new JPanel();
  JPanel panel2= new JPanel();
  //Container container3 = new Container();
  Container con = getContentPane();

  
  public frame_class2(){    
    //panel1 = getContentPane();
    //add(area1);
    //add labels to the first panel
    panel1.setLayout(layout_frame1);
    panel2.setLayout(layout_frame1);
    panel1.add(x_loc);
    panel1.add(x_loc_box);
    panel1.add(y_loc);
    panel1.add(y_loc_box);
    panel1.add(w_label);
    panel1.add(w_loc_box);
    panel1.add(h_label);
    panel1.add(h_loc_box);
    //add buttons to the second panel
    draw_button.addActionListener(this);
    quit_button.addActionListener(this);
    info_button.addActionListener(this);
    panel2.add(draw_button);
    panel2.add(quit_button);
    panel2.add(info_button);
    
    con.add(panel1, BorderLayout.NORTH);
    //con.add(new JSeparator(), BorderLayout.CENTER);
    
    con.add(panel2, BorderLayout.SOUTH);
    setDefaultCloseOperation(super.EXIT_ON_CLOSE);
    setTitle("Graphics Toolbox v2");
     //Set up the content pane.
      //this.getContentPane();
    pack();
    //setSize(500, 500);
    setLocationRelativeTo(null);
    //setBackground(Color.BLUE);
    setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if (e.getSource()==info_button){
        info1.showMessageDialog(this, "hahahahahaha"); 
    }
    else if (e.getSource()==quit_button){
        System.exit(0);
    }
    else if (e.getSource()==draw_button){
                
        graphics_class2 input1 = new graphics_class2();
        con.add(input1);        
        //info1.showMessageDialog(this, "Not yet!");
        
    }
    
    
  }
  
  

}

//graphics class
class graphics_class2 extends Canvas{
  
  public graphics_class2(){
    //frame_class1 inst1 = new frame_class1();
    //Canvas img1 = inst1.area1;
    setSize(50,50);
    //setBackground(Color.BLUE);
  }
  
  public void paint(Graphics g){
    super.paint(g); 
    g.setColor(Color.GREEN);
    g.fillArc(0, 0, 50, 50, 50, 50);
    
  }
  
  

}



public class main_code {
    
    public static void main(String args[]){
    frame_class2 inst1 = new frame_class2();
    }
    
    

}
java swing user-interface jframe jpanel
2个回答
4
投票

“Swing 程序应该覆盖

paintComponent()
,而不是覆盖
paint()
。”—在 AWT 和 Swing 中绘制:绘制方法
JPanel
JComponent
是常见选择,如 here 所建议。您可以使用合适的布局来控制放置。

附录:这与

Canvas
有什么关系?

java.awt.Canvas
是一个 AWT 组件;而是使用 Swing 组件
javax.swing.JPanel
。这是程序的一个变体,它仅选择随机颜色,但它可能会让您了解如何处理其他属性。有一个相关的例子这里

image

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainCode {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                MainView fc = new MainView();
            }
        });
    }

    private static class MainView implements ActionListener {

        private JFrame f = new JFrame();
        private JButton colorButton = new JButton("Color");
        private JButton quitButton = new JButton("Quit");
        private JButton infoButton = new JButton("Info");
        private JLabel x_loc = new JLabel("X:");
        private JLabel y_loc = new JLabel("Y:");
        private JLabel w_label = new JLabel("Width:");
        private JLabel h_label = new JLabel("Height:");
        private JTextField x_loc_box = new JTextField("0");
        private JTextField y_loc_box = new JTextField("0");
        private JTextField w_loc_box = new JTextField("100");
        private JTextField h_loc_box = new JTextField("100");
        private JOptionPane info1 = new JOptionPane();
        private JPanel panel1 = new JPanel();
        private JPanel panel2 = new JPanel();
        private GraphicsClass graphicsClass = new GraphicsClass();

        public MainView() {
            panel1.add(x_loc);
            panel1.add(x_loc_box);
            panel1.add(y_loc);
            panel1.add(y_loc_box);
            panel1.add(w_label);
            panel1.add(w_loc_box);
            panel1.add(h_label);
            panel1.add(h_loc_box);
            colorButton.addActionListener(this);
            quitButton.addActionListener(this);
            infoButton.addActionListener(this);
            panel2.add(colorButton);
            panel2.add(quitButton);
            panel2.add(infoButton);
            f.add(panel1, BorderLayout.NORTH);
            f.add(graphicsClass, BorderLayout.CENTER);
            f.add(panel2, BorderLayout.SOUTH);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setTitle("Graphics Toolbox v2");
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == infoButton) {
                JOptionPane.showMessageDialog(f, "hahahahahaha");
            } else if (e.getSource() == quitButton) {
                System.exit(0);
            } else if (e.getSource() == colorButton) {
                graphicsClass.randomColor();
                graphicsClass.repaint();
            }
        }
    }

    private static class GraphicsClass extends JPanel {

        private static final int SIZE = 128;
        private static final Random r = new Random();
        private Color color = Color.green;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(SIZE, SIZE);
        }

        public void randomColor() {
            this.color = new Color(r.nextInt());
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            int w = getWidth();
            int h = getHeight();
            g.fillArc(0, h / 4, w, h, 45, 90);
        }
    }
}

1
投票

将画布添加到该面板的末尾。组件已添加到已显示的容器中,必须在该容器上调用

validate
才能显示新组件。

© www.soinside.com 2019 - 2024. All rights reserved.