gpt4 book ai didi

java - 在 Java 中切换只读

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:36 26 4
gpt4 key购买 nike

有没有一种方法可以切换只读模式,这样当您单击窗口中的任何对象时,它只会返回您单击的内容,而忽略该对象的常规事件处理? IE,在这种“只读”模式下,如果你点击一个按钮,它只是返回按钮,而不是实际按下按钮。然后我可以做类似的事情:

if ("thing pressed" == button) "do this";
else if ("thing pressed" == panel) "do that";
else "do nothing";

这是我的代码,它是一个包含 3 个彩色框的框架。单击第二个框、第三个框或背景将显示一条消息。单击框 1 没有任何作用。我喜欢使用新的鼠标适配器,所以我想这样做。

现在我想要的是当您单击框 1 时,框 1 被视为已选中(如果这有助于您了解图片)。然后,如果您再次单击任何地方,包括方框 1,方框 1 将被取消选择并且不会显示任何其他内容(这意味着方框 2、方框 3 或背景消息将显示)。那时,只有点击框 2 或 3 时,它们仍不会显示正常消息,而是会显示不同的消息。

如果我说得有点短,我很抱歉。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Labels {
public static void main(String[] args) {
new Labels();
}

Square l1, l2, l3;
public Labels() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
l1 = new Square();
l2 = new Square();
l3 = new Square();

frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(120, 150);
frame.setResizable(false);

panel.setVisible(true);
panel.setLayout(null);
l1.setLocation(5, 5);
l2.setLocation(5, 60);
l3.setLocation(60, 5);

l2.setColor("yellow");
l3.setColor("black");

l1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//do nothing
}
});

l2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Pushed label 2");
}
});
l3.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Pushed label 3");
}
});
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("pushed background");
}
});

frame.add(panel);
panel.add(l1);
panel.add(l2);
panel.add(l3);
}

class Square extends JLabel{
Color color = Color.blue;

public Square() {
// TODO Auto-generated constructor stub\
setVisible(true);
setSize(50,50);
}

public void paint(Graphics g) {
super.paint(g);
g.setColor(color);
g.fillRect(0, 0, 50, 50);
}
public void setColor(String color){
if (color == "white") this.color = Color.white;
else if (color == "black") this.color = Color.black;
else if (color == "yellow") this.color = Color.yellow;
else {
System.out.println("Invalid color");
return;
}
repaint();
}
}
}

最佳答案

不要禁用任何东西。只需更改类的状态,也许可以使用一些 boolean 标志变量/字段,并根据按下的内容更改这些标志。

所以有 boolean 字段称为 label1PressedLastlabel2PressedLastlabel3PressedLast 或类似的东西,当按下标签时,检查状态所有其他标志,并让您的程序的行为根据这些标志的状态和刚刚按下的标签而改变。然后将所有标志设置为 false,除了对应于刚刚按下的标签的标志。

例如,这个小程序只有在按下第一个和第三个 JLabel 时才会使用react:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public class FlagEg extends JPanel {
private static final int LABEL_COUNT = 3;
private JLabel[] labels = new JLabel[LABEL_COUNT];
private boolean[] flags = new boolean[LABEL_COUNT];

public FlagEg() {
setLayout(new GridLayout(1, 0, 20, 0));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

// panel mouse listener
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
inactivateAll();
}
});

MouseListener labelsMouseListener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseEvt) {
myMousePressed(mouseEvt);
}
};

// create JLabels and add MouseListener
for (int i = 0; i < labels.length; i++) {
labels[i] = new JLabel("Label " + (i + 1));
labels[i].addMouseListener(labelsMouseListener);
labels[i].setOpaque(true);
labels[i].setBorder(BorderFactory.createLineBorder(Color.black));
add(labels[i]);
}
}

private void inactivateAll() {
for (int i = 0; i < labels.length; i++) {
labels[i].setBackground(null);
flags[i] = false;
}
}

private void myMousePressed(MouseEvent mouseEvt) {
JLabel label = (JLabel) mouseEvt.getSource();

// which label was pressed?
int index = -1;
for (int i = 0; i < labels.length; i++) {
if (label == labels[i]) {
index = i;
}
}

// check if first label and then third pressed:
if (flags[0] && index == 2) {
System.out.println("first and then third label pressed!");
}

// reset all labels and flags to initial state
inactivateAll();

// set pressed label background color and set flag of label just pressed
labels[index].setBackground(Color.pink);
flags[index] = true;

}

private static void createAndShowGui() {
FlagEg mainPanel = new FlagEg();

JFrame frame = new JFrame("Flag Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

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

逻辑迭代二:只有标签 1 是“初级”JLabel。这实际上更容易实现,因为现在你只需要一个 boolean 标志,代表标签 1 被按下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class FlagEg2 extends JPanel {
private static final int LABEL_COUNT = 3;
private JLabel[] labels = new JLabel[LABEL_COUNT];

private boolean label1Flag = false;

public FlagEg2() {
setLayout(new GridLayout(1, 0, 20, 0));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

// panel mouse listener
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
inactivateAll();
}
});

MouseListener labelsMouseListener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseEvt) {
myMousePressed(mouseEvt);
}
};

// create JLabels and add MouseListener
for (int i = 0; i < labels.length; i++) {
labels[i] = new JLabel("Label " + (i + 1));
labels[i].addMouseListener(labelsMouseListener);
labels[i].setOpaque(true);
labels[i].setBorder(BorderFactory.createLineBorder(Color.black));
add(labels[i]);
}
}

private void inactivateAll() {
for (int i = 0; i < labels.length; i++) {
labels[i].setBackground(null);
label1Flag = false;
}
}

private void myMousePressed(MouseEvent mouseEvt) {
JLabel label = (JLabel) mouseEvt.getSource();

// which label was pressed?
int index = -1;
for (int i = 0; i < labels.length; i++) {
if (label == labels[i]) {
index = i;
}
}

if (label1Flag) {
if (index == 1) {
System.out.println("Label 1 and label 2 pressed");
} else if (index == 2) {
System.out.println("Label 1 and label 3 pressed");
}

}

// reset all labels and flags to initial state
inactivateAll();

// if label1, then activate it
if (index == 0) {
labels[0].setBackground(Color.pink);
label1Flag = true;
}

}

private static void createAndShowGui() {
FlagEg2 mainPanel = new FlagEg2();

JFrame frame = new JFrame("Flag Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

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

关于java - 在 Java 中切换只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8290340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com