私は、グリッドを表示し、ユーザーがグリッドの線 (つまり、境界線) を変更できるテーブルトップ RPG のグラフィカル ツールに取り組んでいます。
私が現在持っているのは、次の行に沿ったコードです。
if(quadrant ==2)
{
setBorder(new CompoundBorder(getBorder(), new MatteBorder(0,0,3,0, Color.BLUE)));
}
マウスが正方形の下部近くのポイントの範囲内でクリックされると、下部の境界線が青色に変わり、他の境界線は同じままになります。このコードは、新しい境界線を古い境界線に追加するため機能しません。その後、一番下の行をクリックすると、新しい青い境界線が前の青い境界線の上に配置されるため、青い境界線が高くなり、正方形が青く塗りつぶされます。最終的な目標は、複数のクリックで色を循環させることです。つまり、1 回クリックすると青、2 回クリックすると緑、3 回クリックするとデフォルトの黒に戻ります。
私の考えは、getBorder() を受け取る新しいカスタム ボーダー クラスを作成することですが、片側にボーダーがないように変更します。しかし、それを実現する方法がわかりません。
完全なコードを追加するために編集:
TestGrid02 クラス:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.MatteBorder;
public class TestGrid02 {
public static void main(String[] args) {
new TestGrid02();
}
public TestGrid02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
TestPane クラス:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.MatteBorder;
public class TestPane extends JPanel {
Border border = null;
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
gbc.gridx = col;
gbc.gridy = row;
CellPane cellPane = new CellPane();
if (row < 9) {
if (col < 9) {
border = new MatteBorder(1, 1, 0, 0, Color.BLACK);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.BLACK);
}
} else {
if (col < 9) {
border = new MatteBorder(1, 1, 1, 0, Color.BLACK);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.BLACK);
}
}
cellPane.setBorder(border);
cellPane.setBackground(Color.WHITE);
add(cellPane, gbc);
}
}
}
}
CellPane クラス:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
public class CellPane extends JPanel {
public CellPane() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
int quadrant = 0;
if((p.x >= 0 && p.x <11) && p.y >= 0 && p.y < 41)
{
quadrant = 1;
}
else if((p.x >= 0 && p.x <41) && p.y >= 40)
{
quadrant = 2;
}
else if((p.x >= 10 && p.x <51) && p.y < 11)
{
quadrant = 3;
}
else if((p.x >40 && p.y >10))
{
quadrant = 4;
}
else
{
quadrant = 5;
}
if(e.getButton()== MouseEvent.BUTTON1)
{
if(quadrant==1)
{
Border border = getBorder();
if (border instanceof CompoundBorder) {
border = ((CompoundBorder)border).getOutsideBorder();
}
setBorder(new CompoundBorder(border, new MatteBorder(0,3,0,0, Color.BLUE)));
}
if(quadrant ==2)
{
Border border = getBorder();
if (border instanceof CompoundBorder) {
border = ((CompoundBorder)border).getOutsideBorder();
}
setBorder(new CompoundBorder(border, new MatteBorder(0,0,3,0, Color.BLUE)));
}
if(quadrant ==3)
{
Border border = getBorder();
if (border instanceof CompoundBorder) {
border = ((CompoundBorder)border).getOutsideBorder();
}
setBorder(new CompoundBorder(border, new MatteBorder(3,0,0,0, Color.BLUE)));
}
if(quadrant == 4)
{
Border border = getBorder();
if (border instanceof CompoundBorder) {
border = ((CompoundBorder)border).getOutsideBorder();
}
setBorder(new CompoundBorder(border, new MatteBorder(0,0,0,3, Color.BLUE)));
}
//original code. These borders "grow" on subsequent clicks
/*
if(quadrant==1)
{
setBorder(new CompoundBorder(getBorder(), new MatteBorder(0,3,0,0, Color.BLUE)));
}
if(quadrant ==2)
{
setBorder(new CompoundBorder(getBorder(), new MatteBorder(0,0,3,0, Color.BLUE)));
}
if(quadrant ==3)
{
setBorder(new CompoundBorder(getBorder(), new MatteBorder(3,0,0,0, Color.BLUE)));
}
if(quadrant == 4)
{
setBorder(new CompoundBorder(getBorder(), new MatteBorder(0,0,0,3, Color.BLUE)));
}
*/
if(quadrant == 5)
{
//setBorder(new MatteBorder(3,3,3,3, Color.BLUE)); //Click in the middle to highlight all sides of a square
}
}
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}