java jbutton 禁用,如何制作禁用JButton的方法?

I am trying to make a method that disables JButtons.

The JButtons are in an array in the form of a grid, JButton [int][int] and the integers are supposed to be coordinates.

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import javax.swing.*;

import javax.swing.border.*;

public class BS {

public static JFrame f = new JFrame("BS");

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

initializeGui();

}

});

}

static void initializeGui() {

JPanel gui = new JPanel(new BorderLayout(3,1));

//This is the array of the JButtons in the form of a grid

final JButton[][] coordinates = new JButton[15][15];

JPanel field;

// set up the main GUI

gui.setBorder(new EmptyBorder(5, 5, 5, 5));

field = new JPanel(new GridLayout(0, 15));

field.setBorder(new CompoundBorder(new EmptyBorder(15,15,15,15),new LineBorder(Color.BLACK)));

JPanel boardConstrain = new JPanel(new GridBagLayout());

boardConstrain.add(field);

gui.add(boardConstrain);

//The making of the grid

for (int ii = 0; ii < coordinates.length; ii++) {

for (int jj = 0; jj < coordinates[ii].length; jj++) {

JButton b = new JButton();

ImageIcon icon = new ImageIcon(

new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB));

b.setIcon(icon);

coordinates[jj][ii] = b;

field.add(coordinates[jj][ii]);

}

}

f.add(gui);

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

f.pack();

f.setMinimumSize(f.getSize());

f.setVisible(true);

}

}

解决方案

I did some changes in your code:

public static JFrame f = new JFrame("BS"); JFrame shouldn't be static and should have a more meaningful name (like frame for example).

final JButton[][] coordinates = new JButton[15][15]; moved this array as a class member and made it non final and also changed the name to buttons as it's easier to know what it is (coordinates to me, sounds more like an array of Point or int)

After that I added an ActionListener, see How to use Actions tutorial.

private ActionListener listener = e -> {

//Loops through the whole array in both dimensions

for (int i = 0; i < buttons.length; i++) {

for (int j = 0; j < buttons[i].length; j++) {

if (e.getSource().equals(buttons[i][j])) { //Find the JButton that was clicked

if (isStartButton) { //startButton is a boolean variable that tells us if this is the first button clicked or not

startXCoord = i;

startYCoord = j;

} else {

endXCoord = i;

endYCoord = j;

disableButtons(); //Only when we have clicked twice we disable all the buttons in between

}

isStartButton = !isStartButton; //In every button click we change the value of this variable

break; //No need to keep looking if we found our clicked button. Add another one with a condition to skip the outer loop.

}

}

}

};

And a method called disableButtons() which disables all the buttons between the 2 clicked buttons:

private void disableButtons() {

compareCoords(); //This method checks if first button clicked is after 2nd one.

for (int i = startXCoord; i <= endXCoord; i++) {

for (int j = startYCoord; j <= endYCoord; j++) {

buttons[i][j].setEnabled(false); //We disable all buttons in between

}

}

}

At the end our code ends like this:

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.GridBagLayout;

import java.awt.GridLayout;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

import javax.swing.border.CompoundBorder;

import javax.swing.border.EmptyBorder;

import javax.swing.border.LineBorder;

public class DisableButtonsInBetween {

private JFrame frame = new JFrame(getClass().getSimpleName());

private JButton[][] buttons;

private int startXCoord = -1;

private int startYCoord = -1;

private int endXCoord = -1;

private int endYCoord = -1;

private boolean isStartButton = true;

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

new DisableButtonsInBetween().initializeGui();

}

});

}

void initializeGui() {

JPanel gui = new JPanel(new BorderLayout(3, 1));

// This is the array of the JButtons in the form of a grid

JPanel pane;

buttons = new JButton[15][15];

// set up the main GUI

gui.setBorder(new EmptyBorder(5, 5, 5, 5));

pane = new JPanel(new GridLayout(0, 15));

pane.setBorder(new CompoundBorder(new EmptyBorder(15, 15, 15, 15), new LineBorder(Color.BLACK)));

JPanel boardConstrain = new JPanel(new GridBagLayout());

boardConstrain.add(pane);

gui.add(boardConstrain);

// The making of the grid

for (int ii = 0; ii < buttons.length; ii++) {

for (int jj = 0; jj < buttons[ii].length; jj++) {

buttons[jj][ii] = new JButton();

ImageIcon icon = new ImageIcon(new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB));

buttons[jj][ii].setIcon(icon);

buttons[jj][ii].addActionListener(listener);

pane.add(buttons[jj][ii]);

}

}

frame.add(gui);

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.pack();

frame.setMinimumSize(frame.getSize());

frame.setVisible(true);

}

//The ActionListener is what gets called when you click a JButton

private ActionListener listener = e -> {

//These for loops are done to identify which button was clicked.

for (int i = 0; i < buttons.length; i++) {

for (int j = 0; j < buttons[i].length; j++) {

if (e.getSource().equals(buttons[i][j])) {

if (isStartButton) {

//We save the coords of the 1st button clicked

startXCoord = i;

startYCoord = j;

} else {

//We save the coords of the 2nd button clicked and call the disableButtons method

endXCoord = i;

endYCoord = j;

disableButtons();

}

isStartButton = !isStartButton;

break;

}

}

}

};

//This method disables all the buttons between the 2 that were clicked

private void disableButtons() {

compareCoords();

for (int i = startXCoord; i <= endXCoord; i++) {

for (int j = startYCoord; j <= endYCoord; j++) {

buttons[i][j].setEnabled(false);

}

}

}

//This method compares the coords if the 2nd button was before (in its coords) than the 1st one it switched their coords

private void compareCoords() {

if (endXCoord < startXCoord) {

int aux = startXCoord;

startXCoord = endXCoord;

endXCoord = aux;

}

if (endYCoord < startYCoord) {

int aux = startYCoord;

startYCoord = endYCoord;

endYCoord = aux;

}

}

}

Jf1mo.png

I hope this is what you were trying to do... if not please clarify.

I do not have the arrow operator, " -> ". I think it requires a higher Java. Is there a way to replace this?

For Java 7 and lower use this for the ActionListener:

private ActionListener listener = new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

for (int i = 0; i < buttons.length; i++) {

for (int j = 0; j < buttons[i].length; j++) {

if (e.getSource().equals(buttons[i][j])) {

if (isStartButton) {

startXCoord = i;

startYCoord = j;

} else {

endXCoord = i;

endYCoord = j;

disableButtons();

}

isStartButton = !isStartButton;

break;

}

}

}

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值