2011-11-18 77 views
2

我有一个框架,我已经创建了一个主面板。通过另一个面板上的按钮动态添加按钮到一个面板

在该面板上有2个面板。我想要的是,我有按钮说panel1,现在,一旦我点击按钮,我想绘制第二个面板上的2D对象。

我尝试了很多东西,但它是徒劳的。请帮助我在这种情况下。任何帮助,将不胜感激。 谢谢,

import java.awt.event.ActionEvent; 
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.ActionListener; 
    import javax.swing.border.Border; 

    public class iframe extends JFrame implements ActionListener{ 
    public JPanel jp0=new JPanel(new GridLayout()); 
    public JPanel jp1=new JPanel(new GridLayout(1,3)); 
    myclass my=new myclass(100,200,300,400,500,600,700,900,800,10000,3000,600); 
    public JPanel jp2=new JPanel(new BorderLayout()); 

    @SuppressWarnings("ResultOfObjectAllocationIgnored") 
    public static void main(String args[]) 
    { 
     iframe f=new iframe(); 
    } 
    public iframe(myclass my) 
    { 
     this.my=my; 
     Border border = BorderFactory.createTitledBorder("bordersarehers") ; 
     jp1.setBorder(border); 

     JButton button1=new JButton(); 
     ImageIcon img1=new ImageIcon("","b1"); 
     button1=new JButton(img1); 
     button1.addActionListener(this); 
     jp1.add(button1); 

     JButton button2=new JButton(); 
     ImageIcon img2=new ImageIcon("","b1"); 
     button2=new JButton(img2); 
     jp1.add(button2); 

     JButton button3=new JButton(); 
     ImageIcon img3=new ImageIcon("","b1"); 
     button3=new JButton(img3); 
     jp1.add(button3); 

     Border border2 = BorderFactory.createTitledBorder(""); 
     jp2.setBorder(border2); 

     jp0.add(jp1); 
     jp0.add(jp2); 
     jp2.add(my); 
     this.add(jp0); 
     this.add(jp2); 
     this.add(jp1,BorderLayout.EAST); 
     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     this.setVisible(true); 
} 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource()=="b1") 
     { 

     } 
    } 
} 


class myclass extends JPanel 
{ 
    int a,b,c,d,e,f,g1,h,i,j,k,l; 
    myclass(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int x6,int y6) 
    { 
     a=x1; 
     b=y1; 

     c=x2; 
     d=y2; 

     e=x3; 
     f=y3; 

     g1=x4; 
     h=y4; 

     i=x5; 
     j=y5; 

     k=x6; 
     l=y6; 
    } 
    public void drawpoly() 
    { 
     repaint(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     int xcoord[]=new int[]{a,c,e,g1,i,k}; 
    int ycoord[]=new int[]{b,d,f,h,j,l}; 
     g.drawPolygon(xcoord,ycoord,6); 
    } 
} 
+0

它可以是一个按钮/ 2D image.sorry FR d垃圾邮件。 – pascal

+0

你可以保留元素和[切换可见性](http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#setVisible(boolean))? – aishwarya

+0

@aishwarya:谢谢你,但是,我试图这样做,现在我正试图检查上述事情是否发生。下次会有3-4个面板,可见性会令人困惑。 – pascal

回答

1

有这个代码这么多疯狂的事情。我认为这是要你想做的事:

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import javax.swing.border.Border; 

public class Iframe extends JFrame implements ActionListener { 
    public JPanel jp0 = new JPanel(new GridLayout()); 
    public JPanel jp1 = new JPanel(new GridLayout(1, 3)); 
    public JPanel jp2 = new JPanel(new BorderLayout()); 
    Myclass  my = new Myclass(100, 200, 300, 400, 500, 600, 700, 900, 800, 10000, 3000, 600); 

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

    public Iframe() { 
     Border border = BorderFactory.createTitledBorder("Pentahexes"); 
     jp1.setBorder(border); 

     ImageIcon Pentaheximg1 = new ImageIcon("E:/NetBeans/Pentahex-Game/src/pentahex/game/Pentahex1.jpg", "b1"); 
     JButton Pentahexbutton1 = new JButton(Pentaheximg1); 
     Pentahexbutton1.addActionListener(this); 
     Pentahexbutton1.setName("b1"); 
     jp1.add(Pentahexbutton1); 

     ImageIcon Pentaheximg2 = new ImageIcon("E:/NetBeans/Pentahex-Game/src/pentahex/game/Pentahex2.jpg", "b1"); 
     JButton Pentahexbutton2 = new JButton(Pentaheximg2); 
     Pentahexbutton2.addActionListener(this); 
     Pentahexbutton2.setName("b2"); 
     jp1.add(Pentahexbutton2); 

     ImageIcon Pentaheximg3 = new ImageIcon("E:/NetBeans/Pentahex-Game/src/pentahex/game/Pentahex3.jpg", "b1"); 
     JButton Pentahexbutton3 = new JButton(Pentaheximg3); 
     Pentahexbutton3.addActionListener(this); 
     Pentahexbutton3.setName("b3"); 
     jp1.add(Pentahexbutton3); 

     Border border2 = BorderFactory.createTitledBorder("Puzzle"); 
     jp2.setBorder(border2); 

     jp0.add(jp1); 
     jp0.add(jp2); 
     jp2.add(my); 
     this.add(jp0); 
     this.add(jp2); 
     this.add(jp1, BorderLayout.EAST); 
     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if("b1".equals(((JButton)e.getSource()).getName())) { 
      my.setData(100, 200, 300, 400, 500, 600, 700, 900, 800, 10000, 3000, 600); 
     } 
     if("b2".equals(((JButton)e.getSource()).getName())) { 
      my.setData(10, 20, 30, 400, 50, 60, 70, 80, 90, 100, 110, 120); 
     } 
     if("b3".equals(((JButton)e.getSource()).getName())) { 
      my.setData(10, 30, 45, 400, 60, 75, 90, 80, 90, 1000, 3010, 120); 
     } 
     my.drawpoly(); 
    } 
} 

class Myclass extends JPanel { 
    int a, b, c, d, e, f, g1, h, i, j, k, l; 

    Myclass(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int x5, int y5, int x6, int y6) { 
     setData(x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6); 
    } 

    public void setData(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int x5, int y5, int x6, int y6) { 
     a = x1; 
     b = y1; 

     c = x2; 
     d = y2; 

     e = x3; 
     f = y3; 

     g1 = x4; 
     h = y4; 

     i = x5; 
     j = y5; 

     k = x6; 
     l = y6; 
    } 

    public void drawpoly() { 
     invalidate(); 
     repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int xcoordinatesofthehexagon[] = new int[] { a, c, e, g1, i, k }; 
     int ycoordinatesofthehexagon[] = new int[] { b, d, f, h, j, l }; 
     g.drawPolygon(xcoordinatesofthehexagon, ycoordinatesofthehexagon, 6); 
    } 
} 

UPDATE

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.Map.Entry; 

import javax.swing.border.Border; 

public class Iframe extends JFrame implements ActionListener { 

    private static final String PATH = "E:/NetBeans/Pentahex-Game/src/pentahex/game/"; 

    HashMap<String, int[]> pentahexMap = new HashMap<String, int[]>() {{ 

     put("Clear",  new int[]{ 0,0,0,0,0,0,0,0,0,0,0,0 }); 
     put("Pentahex1", new int[]{ 0,0,0,50,50,50,25,25,50,0,0,0 }); 
     put("Pentahex2", new int[]{ 100,100,100,150,150,150,125,125,150,100,100,100 }); 
     put("Pentahex3", new int[]{ 10, 30, 45, 400, 60, 75, 90, 80, 90, 500, 310, 120 }); 

    }}; 

    private Myclass my = new Myclass(); 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Iframe().setVisible(true); 
      } 
     }); 
    } 

    public Iframe() { 

     JPanel jp0 = new JPanel(new GridLayout()); 
     JPanel jp1 = new JPanel(new GridLayout(1, 3)); 
     JPanel jp2 = new JPanel(new BorderLayout()); 

     for(Entry<String, int[]> entry : pentahexMap.entrySet()) { 
      JButton pentahexbutton1; 
      try { 
       URL imgUrl    = new URL(PATH + entry.getKey() +".jpg"); 
       ImageIcon pentaheximg1 = new ImageIcon(imgUrl); 
       pentahexbutton1   = new JButton(pentaheximg1); 
      } catch(MalformedURLException e) { 
       pentahexbutton1 = new JButton(entry.getKey()); 
      } 
      pentahexbutton1.addActionListener(this); 
      pentahexbutton1.setName(entry.getKey()); 
      jp1.add(pentahexbutton1); 
     } 

     jp1.setBorder(BorderFactory.createTitledBorder("Pentahexes")); 
     jp2.setBorder(BorderFactory.createTitledBorder("Puzzle")); 

     jp0.add(jp1); 
     jp0.add(jp2); 
     jp2.add(my); 
     this.add(jp0); 
     this.add(jp2); 
     this.add(jp1, BorderLayout.EAST); 
     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     int[] data = pentahexMap.get(((JButton)e.getSource()).getName()); 
     if(data != null) { 
      my.setData(data); 
      my.invalidate(); 
      my.repaint(); 
     } 
    } 
} 

class Myclass extends JPanel { 
    int a, b, c, d, e, f, g, h, i, j, k, l; 
    Myclass(){} 
    Myclass(int... data) { 
     setData(data); 
    } 
    public void setData(int... data) { 
     if(data.length < 12) { 
      throw new IllegalArgumentException("not enough data"); 
     } 
     a = data[0]; 
     b = data[1]; 
     c = data[2]; 
     d = data[3]; 
     e = data[4]; 
     f = data[5]; 
     g = data[6]; 
     h = data[7]; 
     i = data[8]; 
     j = data[9]; 
     k = data[10]; 
     l = data[11]; 
    } 
    @Override 
    public void paintComponent(Graphics graphics) { 
     super.paintComponent(graphics); 
     int[] xcoordinatesofthehexagon = new int[] { a, c, e, g, i, k }; 
     int[] ycoordinatesofthehexagon = new int[] { b, d, f, h, j, l }; 
     if(!isEmpty(xcoordinatesofthehexagon, ycoordinatesofthehexagon)){ 
      graphics.drawPolygon(xcoordinatesofthehexagon, ycoordinatesofthehexagon, 6); 
     } 
    } 
    private boolean isEmpty(int[] x,int[] y) { 
     for(int i : y) { 
      if(i != 0) { 
       return false; 
      } 
     } 
     for(int i : x) { 
      if(i != 0) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 
+0

嗨@oliholz:非常感谢您的答复。只有一个问题。当我加载框架时,我看到已在面板上绘制的2D图像。但是,我想要的是在单击按钮1之后,只有它应该得到加载到panel.Rest工作正常。谢谢你。 – pascal

+0

与更新的代码,您可以将新数据放入'pentahexMap'并且它可以在不更改布局的情况下工作(键与ButtonImage名称相同)并在启动时将其清空并且可以清除。 :) – oliholz

1

看看Swing Action

您可以添加动作按钮并通过面板作为参数

相关问题