簡體   English   中英

Java:可點擊元素的網格

[英]Java: Grid of clickable elements

我打算為我當前的項目編寫一個編輯器,並且需要一些java swing。

基本上我需要某種框架內的網格; 應該能夠通過點擊選擇網格的單個元素,並使用下拉/選擇器元素,您應該能夠更改網格元素的顏色

任何人都可以告訴我,我需要哪些擺動部分? 任何幫助將非常感激 ;)

編輯:讓我們進入細節

這個編輯器計划生成我與我的一些朋友開發的Android策略游戲的地圖讓我們說我們有一個16x16字段的方形字段,默認情況下都是綠色的。 通過選擇單個字段,我希望能夠將此字段的顏色更改為其他字段。

另外,每個字段都應該能夠返回它的值(即顏色)

你的問題在細節上有點簡短,但也許你想要一個使用GridLayout的JPanel並保存一個其opaque屬性為true的JLabel數組。 您可以將一個MouseListener添加到JLabel,它顯示一個顯示可能顏色的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();
      }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM