2011-11-05 90 views
4

我打算为当前项目编辑一个编辑器,并且需要一些java swing。Java:可点击元素的网格

基本上我需要在某种框架内的网格;网格的单个元素应该能够通过点击来选择并且通过下拉/选择器元素,您应该能够更改网格元素的颜色

任何人都可以告诉我哪些部分的挥杆将需要那?任何帮助将非常感激;)

编辑:让我们有点到这个编辑器计划生成的机器人战略游戏,我和我的一些朋友下发展 让地图详细

说,我们有一个正方形所有默认为绿色的16x16字段的字段。 通过选择单个字段,我希望能够将该字段的颜色更改为其他字段。

此外,每场应该能够返回它的值(即颜色)

+0

参见['ColorLabel'](http://stackoverflow.com/questions/5136859/mouselistener-help-java/5137250#5137250)。 – trashgod

回答

9

你提的问题是关于细节有点短,但也许你想使用网格布局并持有的JLabel其数组一个JPanel不透明的属性是真实的。您可以将MouseListener添加到JLabels,该JLabels显示显示可能颜色的JPopupMenu,然后根据所选内容使用它设置JLabel的背景颜色(显示为已变得不透明)。

例如:

Main.java

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Main { 
    private static void createAndShowGui() { 
     int rows = 20; 
     int cols = 40; 
     int cellWidth = 20; 
     ColorGrid mainPanel = new ColorGrid(rows, cols, cellWidth); 

     JFrame frame = new JFrame("Color Grid Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

ColorGrid.java

import java.awt.Dimension; 
import java.awt.GridLayout; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ColorGrid extends JPanel { 
    private MyColor[][] myColors; 
    private JLabel[][] myLabels; 

    public ColorGrid(int rows, int cols, int cellWidth) { 
     myColors = new MyColor[rows][cols]; 
     myLabels = new JLabel[rows][cols]; 

     MyMouseListener myListener = new MyMouseListener(this); 
     Dimension labelPrefSize = new Dimension(cellWidth, cellWidth); 
     setLayout(new GridLayout(rows, cols)); 
     for (int row = 0; row < myLabels.length; row++) { 
     for (int col = 0; col < myLabels[row].length; col++) { 
      JLabel myLabel = new JLabel(); 
      myLabel = new JLabel(); 
      myLabel.setOpaque(true); 
      MyColor myColor = MyColor.GREEN; 
      myColors[row][col] = myColor; 
      myLabel.setBackground(myColor.getColor()); 
      myLabel.addMouseListener(myListener); 
      myLabel.setPreferredSize(labelPrefSize); 
      add(myLabel); 
      myLabels[row][col] = myLabel; 
     } 
     } 
    } 

    public MyColor[][] getMyColors() { 
     return myColors; 
    } 

    public void labelPressed(JLabel label) { 
     for (int row = 0; row < myLabels.length; row++) { 
     for (int col = 0; col < myLabels[row].length; col++) { 
      if (label == myLabels[row][col]) { 
       MyColor myColor = myColors[row][col].next(); 
       myColors[row][col] = myColor; 
       myLabels[row][col].setBackground(myColor.getColor()); 
      } 
     } 
     } 
    } 
} 

MyColor.java

import java.awt.Color; 

public enum MyColor { 
    GREEN(Color.green, "Green", "g"), RED(Color.red, "Red", "r"), 
    BLUE(Color.blue, "Blue", "b"), YELLOW(Color.yellow, "Yellow", "y"); 
    private Color color; 
    private String name; 
    private String shortName; 

    private MyColor(Color color, String name, String shortName) { 
     this.color = color; 
     this.name = name; 
     this.shortName = shortName; 
    } 

    public MyColor next() { 
     int index = 0; 
     for (int i = 0; i < MyColor.values().length; i++) { 
     if (MyColor.values()[i] == this) { 
      index = (i + 1) % MyColor.values().length; 
     } 
     } 
     return MyColor.values()[index]; 
    } 

    public Color getColor() { 
     return color; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

    @Override 
    public String toString() { 
     return shortName; 
    } 

} 

MyMouseListener.java

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JLabel; 

public class MyMouseListener extends MouseAdapter { 
    private ColorGrid colorGrid; 

    public MyMouseListener(ColorGrid colorGrid) { 
     this.colorGrid = colorGrid; 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) { 
     colorGrid.labelPressed((JLabel)e.getSource()); 
     } else if (e.getButton() == MouseEvent.BUTTON3) { 
     MyColor[][] myColors = colorGrid.getMyColors(); 
     for (int row = 0; row < myColors.length; row++) { 
      for (int col = 0; col < myColors[row].length; col++) { 
       System.out.print(myColors[row][col] + " "); 
      } 
      System.out.println(); 
     } 
     System.out.println(); 
     } 
    } 
} 
+0

编辑我的帖子了解更多详情 – Rickyfox

+0

@Rickyfox:我的建议仍然有效。挂在... –

+0

是啊我会测试它,并发布另一个问题,如果我遇到任何问题实施 – Rickyfox