在Java中切换只读
有没有办法切换只读模式,所以当您单击窗口中的任何对象时,它只返回您单击的内容,忽略对象的常规事件处理? 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,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(); } } } 解决方法
不要禁用任何东西.只需更改类的状态,可能使用一些布尔标志变量/字段,并根据按下的内容更改这些标志.
所以有名为label1PressedLast,label2PressedLast和label3PressedLast等类似的布尔字段,当按下标签时,检查所有其他标志的状态,并根据这些标志的状态和刚刚按下的标签改变程序的行为.然后将所有标志设置为false,除了与刚刚按下的标签对应的标志. 例如,只有在第一个和第三个JLabel被按下时,这个小程序才会做出反应: 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,20,0)); setBorder(BorderFactory.createEmptyBorder(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.这实际上更容易实现,因为现在您只需要一个布尔标志,表示按下标签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,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(); } }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |