有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java,绘制Jpanel,它位于另一个Jpanel中

嗨 我用JTextArea做了一个火灾模拟器 http://xieu901.webs.com/fire.jar

现在我想用JPanel或Canvas而不是JTextarea(只想挑战自己^^) 我设法在Jframe中仅用JPanel绘制了一幅图像 但我不能在Jframe中的另一个Jpanel中的Jpanel中绘制任何内容

有没有办法在不使用extends JComponent的情况下使用paint方法? 我不知道如何创建一个新的图形对象

public class gui extends JComponent {

    //create gui elements
    MigLayout layout= new MigLayout("fillx,filly", "[70%,fill][30%,fill]","");
 JLabel status = new JLabel("status");
 JTextField sizeoffield = new JTextField();
 JButton ok= new JButton("Start");
 JButton reset= new JButton("Reset");
 JButton update= new JButton("Update");
 JPanel mainPanel = new JPanel(layout);
 JPanel panel = new JPanel();      
 JFrame win = new JFrame("my win");

    //constructor = create gui
    gui(){
  win.setVisible(true);
  win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  win.setBounds(1,1,800,600);
  panel.setPreferredSize(panel.getMaximumSize());//wichtig
  win.add(mainPanel);

  mainPanel.add(panel,"spany 4,align left,aligny top");
 mainPanel.add(sizeoffield,"wrap");
  mainPanel.add(ok,"wrap,aligny t");
  mainPanel.add(reset,"wrap,aligny t");
  mainPanel.add(update,"wrap,aligny t");
  mainPanel.add(status);


  panel.addMouseListener(mouse);
  ok.addActionListener(listener);
  reset.addActionListener(listener);
  update.addActionListener(listener);
 }
    /*******a long code of mouse/actionlistener and other methods was cut here *******/

 //load imageicon to convert to image later
 private ImageIcon loadImage(String s) {
  java.net.URL imgURL = gui.class.getResource(s);
  return new ImageIcon(imgURL); 
 } 

 public void paint(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  g2d.drawString("Java 2D", 50, 50);
  g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
  g2d.setColor(Color.black);
  g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
  g2d.drawImage(fire,1,1,50,50,null);
 }


 @Override
 public void repaint() {
  super.repaint();
 }

 public static void main(String[] args) {
  new gui();
 }
 }

通过上面的代码,我得到了一个普通的JPanel(应该是黑色的,所以我认为没有使用paint方法)

这是我的代码,是JFrame中的JPanel,它可以工作

package jpanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Panel extends JComponent{ //class Panel
  ImageIcon fireicon = loadImage("regen.png");
  ImageIcon normalicon = loadImage("regen.png");
  ImageIcon regenicon = loadImage("regen.png");
  Image fire= fireicon.getImage();
  Image normal= normalicon.getImage();
  Image regen= regenicon.getImage();

 private ImageIcon loadImage(String s) {
  java.net.URL imgURL = gui.class.getResource(s);
  return new ImageIcon(imgURL); 
 } 


  public void paint(Graphics g) {
   Graphics2D g2d = (Graphics2D) g;
   g2d.drawString("Java 2D", 50, 50);
   g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
   g2d.setColor(Color.black);
   g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
   g2d.drawImage(fire,1,1,50,50,null);
 }


// @Override
//  public void repaint() {
//   super.repaint();
//  }

 public static void main(String[] args) {
  JFrame win = new JFrame();
  win.add(new Panel());
  win.setVisible(true);
  win.setSize(400, 400);
 }
}

共 (2) 个答案

  1. # 1 楼答案

    谢谢你,我们, 你的代码帮助了我,现在我可以开始真正的工作了^^

    alt text

        package nad;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Image;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import jpanel.gui;
    
    import net.miginfocom.swing.MigLayout;
    
        class Componentprobe extends JComponent{
    
        ImageIcon fireicon = loadImage("regen.png");
        Image fire= fireicon.getImage();
    
        private ImageIcon loadImage(String s) {
                java.net.URL imgURL = gui.class.getResource(s);
                return new ImageIcon(imgURL); 
        }
    
        protected void paintComponent(Graphics g) {
    //      super.paintComponent(g);
    //
    //        g.setColor(Color.BLACK);
    //        Rectangle r = getBounds();
    //        g.drawRect(r.x + 10, r.y + 10, r.width - 20, r.height - 20);
    
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawString("Java 2D", 50, 50);
            g2d.drawRoundRect(1, 1, 100, 100, 100, 100);
            g2d.setColor(Color.black);
            g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    g2d.drawImage(fire,1+i*50,1+j*50,50,50,null);
                }
            }
    
        }
        public static void main(String[] args) {
            JButton button1= new JButton("OK");
            JButton button2= new JButton("reset");
            JButton button3= new JButton("update");
    
            MigLayout layout= new MigLayout("fillx,filly", "[70%,fill][30%,fill]","");
            Componentprobe component = new Componentprobe();
            JPanel panel = new JPanel(new GridLayout(1, 1)); //Miglayout or null layout wont work
            JPanel main= new JPanel(layout);
            JFrame win = new JFrame("component probe");
    
    
            win.setVisible(true);
            win.setSize(400, 400);
    
            win.add(main);
            main.add(panel,"spany 3,aligny top,align left");
            panel.setPreferredSize(panel.getMaximumSize());//wichtig
            panel.add(component);
    
    
            main.add(button1,"wrap,aligny top");
            main.add(button2,"wrap,aligny top");
            main.add(button3,"aligny t");
    
    
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setSize(400, 300);
            win.setVisible(true);
        }
    
    }
    
  2. # 2 楼答案

    否,GUI的图形是由swing创建的。此示例有效,可能会给您一个提示:

    public static void main(String... args) { 
        JFrame frame = new JFrame("Test");
    
        JPanel outer = new JPanel(new GridLayout(1, 1));
        JPanel inner = new JPanel(new GridLayout(1, 1));
        MyComponent component = new MyComponent();
    
        frame.add(outer, BorderLayout.CENTER);
        outer.add(inner);
        inner.add(component);
    
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
    
    static class MyComponent extends JComponent {
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            g.setColor(Color.BLACK);
            Rectangle r = getBounds();
            g.drawRect(r.x + 10, r.y + 10, r.width - 20, r.height - 20);
        }
    }