java - 指定Canvas在Swing中的位置

标签 java swing user-interface jframe jpanel

我正在学习 Swing GUI 设计。我还没有完全解决的一件事是如何将 Canvas 添加到容器中的特定位置。

更具体地说:我创建了一个使用Paint 方法的Canvas 类。此类的对象被添加到面板中。我不太明白的是,它是如何以及在何处添加到面板的。在 Tkinter 中 Canvas 是一个只包含图像的小部件,但在 Swing 中没有类似的小部件(可能不是最好的词)添加到只包含 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();
    }



}

最佳答案

“Swing 程序应该覆盖 paintComponent() 而不是覆盖 paint()。”— Painting in AWT and Swing: The Paint Methods . JPanelJComponent 是常见的选择,如建议here .您可以使用合适的 layout 来控制放置.

附录:这与 Canvas 有什么关系?

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

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);
        }
    }
}

关于java - 指定Canvas在Swing中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12107163/

相关文章:

java - 停止接收所有 ActionEvents/停止在 Java 中监听一段时间?

右侧带有控件的 CSS 栏

jquery - UI 的可排序列表的动画过渡

java - 将 JButton 放在 JPanel 内 JLabel 的顶部

java - 从actionPerformed和actionListener Java返回字符串

java - 为什么在运行简单的Spring Boot Gradle项目时获得404状态?

java - HttpUrlConnection block 大小和视频文件

java - 如何使用索引使Web应用程序中的数据库访问更快?

java - Gridbag 布局未正确对齐

java - 从文件读取的数据在冒泡排序方法中不起作用