简体   繁体   English

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

[英]java, paint Jpanel, which is inside another JPanel

Hi I made a Fire Simulator with JTextArea http://xieu901.webs.com/fire.jar 嗨,我用JTextArea制作了一个Fire Simulator http://xieu901.webs.com/fire.jar

now I want to make it with JPanel or Canvas instead of JTextarea (just want to challenge myself ^^ ) I managed to draw an image in a only JPanel in Jframe but I cant draw anything in a Jpanel which is in another JPanel in Jframe 现在我想用JPanel或Canvas而不是JTextarea来制作它(只是想挑战自己^^)我设法在Jframe中的唯一JPanel中绘制图像,但是我无法在Jframe中另一个JPanel中的Jpanel中绘制任何图像

are there any way to use the paint method without extends JComponent ? 有什么方法可以使用不扩展JComponent的paint方法? and I dont know how to create a new Graphics object 而且我不知道如何创建一个新的Graphics对象

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

with above code I got a normal JPanel (which should be black, so I think the paint method wasnt used) 通过上面的代码,我得到了一个普通的JPanel(应该为黑色,因此我认为未使用paint方法)

and here was my code which is JPanel in JFrame , with it it worked 这是我的代码,它是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);
 }
}

No, the graphics for the GUI is created by swing. 不,GUI的图形是通过摆动创建的。 This example works and may give you a hint: 该示例有效,并可能给您提示:

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

thanks dacwe, your code helped me, now I can start the real work ^^ 谢谢dacwe,您的代码帮助了我,现在我可以开始实际的工作了^^

替代文字

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM