java, нарисуйте Jpanel, который находится внутри другого JPanel

Привет, я сделал симулятор огня с JTextArea http://xieu901.webs.com/fire.jar

теперь я хочу сделать это с помощью JPanel или Canvas вместо JTextarea (просто хочу бросить вызов себе ^^). Мне удалось нарисовать изображение только в JPanel в Jframe, но я не могу ничего нарисовать в Jpanel, который находится в другой JPanel в Jframe

Есть ли способ использовать метод рисования без расширения JComponent? и я не знаю, как создать новый объект 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();
 }
 }

с приведенным выше кодом я получил обычный JPanel (который должен быть черным, поэтому я думаю, что метод рисования не использовался)

и вот мой код, который представляет собой JPanel в JFrame, с ним он работал

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

person ace    schedule 20.11.2010    source источник


Ответы (2)


Нет, графика для GUI создается свингом. Этот пример работает и может дать вам подсказку:

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);
    }
}
person dacwe    schedule 20.11.2010
comment
+1 Программы Swing должны переопределять paintComponent() вместо paint(), java. sun.com/products/jfc/tsc/articles/painting/index.html - person trashgod; 21.11.2010

спасибо 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);
    }

}
person ace    schedule 21.11.2010