有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建修改现有边框的自定义边框类

我正在为桌面RPG开发一个图形工具,该工具将显示一个网格,并允许用户通过单击鼠标更改网格的线条(即边框),其中网格的每个正方形都是一个jpanel

我目前掌握的代码大致如下:

if(quadrant ==2)
{
      setBorder(new CompoundBorder(getBorder(), new MatteBorder(0,0,3,0, Color.BLUE)));
}

如果在正方形底部附近的点范围内单击鼠标,底部边框将变为蓝色,其他边框将保持不变。此代码不起作用,因为它将新边框添加到旧边框中。在随后单击底线时,蓝色边框将变得更高,因为新的蓝色边框将放置在前一个蓝色边框的顶部。。。直到广场变成蓝色。最终目标是通过多次单击循环使用颜色,即单击一次可选择蓝色,单击两次可选择绿色,单击三次可将其恢复为默认的黑色

我的想法是创建一个新的自定义border类,它接受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);
            }
        }
    }
}

单元窗格类:

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

共 (1) 个答案

  1. # 1 楼答案

    基本上,您需要检查Border并确定它是什么类型,然后从中做出选择

    Border border = getBorder();
    if (border instanceof CompoundBorder) { 
        border = ((CompoundBorder)border).getOutsideBorder();
    }
    setBorder(new CompoundBorder(border, new MatteBorder(0,0,3,0, Color.BLUE)));
    

    基本上,这会检查border是否已经是CompoundBorder,如果已经是,则会抓取外部边界。然后,它使用现有的外部Border和新的MatteBorder创建一个新的边界

    但这并非没有问题

    根据问题的更改进行更新

    基本上,你需要的是某种方式来“记住”点击前的状态,并保持那些不变的状态

    基本上,我所做的是使用Insets。当用户单击时,我检查quadrant并相应地修改insets,然后更新Border

    public class CellPane extends JPanel {
    
        private Insets insets = new Insets(0, 0, 0, 0);
    
        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) {
                            System.out.println("Left");
                            insets.left = insets.left == 0 ? 3 : 0;
                        }
                        if (quadrant == 2) {
                            System.out.println("Bottom");
                            insets.bottom = insets.bottom == 0 ? 3 : 0;
                        }
                        if (quadrant == 3) {
                            System.out.println("Top");
                            insets.top = insets.top == 0 ? 3 : 0;
                        }
                        if (quadrant == 4) {
                            System.out.println("Right");
                            insets.right = insets.right == 0 ? 3 : 0;
                        }
    
                        Border border = getBorder();
                        if (border instanceof CompoundBorder) {
                            border = ((CompoundBorder) border).getOutsideBorder();
                        }
                        setBorder(new CompoundBorder(border, new MatteBorder(insets, 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);
        }
    }