gpt4 book ai didi

java - 使用 MouseListener 的源更改 JLabel 的文本

转载 作者:行者123 更新时间:2023-12-02 11:38:52 24 4
gpt4 key购买 nike

我正在为我的数独项目开发一个 java 组件。该组件代表一个数独框,可以有两种状态:数字或候选(我使用 CardLayout)。到目前为止,一切正常。我现在尝试在我的标签上添加一些 MouseListener。当我点击一个候选者时,我想用一个简单的数字更改状态的值,然后更改显示(cardlayout.show(...))。这里的问题是似乎检测到事件源,但更改尚未完成...这是我的代码(CaseComponent > createController > Candidate[i].addMouseListener() 中的问题:

    package sudoku;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CaseComponent extends JPanel {

private static final long serialVersionUID = 1L;
private static final String CANDIDATES = "candidate";
private static final String DIGIT = "digit";
private GridBagConstraints gridBagConstraint;
private JLabel[] candidates;
private JLabel digit;

public CaseComponent(Color caseColor){
super();
setLayout(new CardLayout());
setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
setPreferredSize(new Dimension(60, 60));
setBackground(caseColor);
createView();
placeComponents();
createController();
}

private void createView() {
gridBagConstraint = new GridBagConstraints();
candidates = new JLabel[9];
for (int i = 0; i < 9; i++) {
candidates[i] = new JLabel(""+(i + 1));
}
digit = new JLabel();
}

private void placeComponents() {
JPanel p = new JPanel(new GridLayout(3, 3)); {
for (int i = 0; i < 9; i++) {
JPanel q = new JPanel(); {
q.add(candidates[i]);
}
q.setOpaque(false);
p.add(q);
}
}
p.setOpaque(false);
add(p, DIGIT);

p = new JPanel(new GridBagLayout()); {
p.add(digit, gridBagConstraint);
p.setOpaque(false);
}
add(p, CANDIDATES);
}

private void createController() {
digit.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
candidateDisplay();
}
}
});

for (int i = 0; i < 9; i++) {
candidates[i].addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JLabel source = (JLabel) e.getSource();
if (SwingUtilities.isLeftMouseButton(e)) {
System.out.println("IN");
digitDisplay();
digit.setText(source.getText());
}
}
});
}
}

private void digitDisplay() {
CardLayout cl = (CardLayout) getLayout();
cl.show(this, DIGIT);
}

private void candidateDisplay() {
CardLayout cl = (CardLayout) getLayout();
cl.show(this, CANDIDATES);
}
}

package sudoku;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Sudoku {

// ATTRIBUTS
private JFrame mainFrame;
private Timer timer;
private JButton pauseButton;
private JButton resumeButton;
private JButton penaltyButton;
private JLabel chronoInfo;
private Chronometer chrono;

public Sudoku() {
createModel();
createView();
placeComponents();
createController();
}

// COMMANDES

/**
* Rend l'application visible au centre de l'écran.
*/
public void display() {
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
}

// OUTILS

private void createModel() {
chrono = new Chronometer();
}

private void createView() {
mainFrame = new JFrame("Sudoku");

resumeButton = new JButton("Reprendre");
resumeButton.setEnabled(false);

pauseButton = new JButton("Pause");

penaltyButton = new JButton("Penalité");

chronoInfo = new JLabel("00:00");
}

private void placeComponents() {
JPanel p = new JPanel(); {
p.add(resumeButton);
p.add(pauseButton);
p.add(penaltyButton);
}
mainFrame.add(p, BorderLayout.NORTH);

p = new JPanel(); {
p.add(chronoInfo);
}
mainFrame.add(p, BorderLayout.SOUTH);

p = new JPanel(); {
JPanel q = new JPanel(new GridLayout(3,3)); {
for (int i = 0; i < 9; i++) {
Color caseColor = i % 2 == 0 ? Color.WHITE : Color.GRAY;
JPanel r = new JPanel(new GridLayout(3,3)); {
for (int j = 0; j < 9; j++) {
r.add(new CaseComponent(caseColor));
}
}
r.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
q.add(r);
}
}
q.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
p.add(q);
}
mainFrame.add(p);

}

private void createController() {
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final int delay = 1000;
timer = new Timer(delay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chrono.increment();
chronoInfo.setText(chrono.toString());
}
});
timer.start();

resumeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
chrono.setPaused(false);
}
});

pauseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
chrono.setPaused(true);
}
});

penaltyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chrono.penalty();
chronoInfo.setText(chrono.toString());
}
});

chrono.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
resumeButton.setEnabled(chrono.isPaused());
pauseButton.setEnabled(!chrono.isPaused());
}
});
}

// POINT D'ENTREE

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Sudoku().display();
}
});
}

}




package sudoku;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;

public class Chronometer {

// ATTRIBUTS
private static final int MAX_SECONDS = 60;
private final EventListenerList listeners;
private final ChangeEvent changeEvent;
private int seconds;
private int minutes;
private boolean paused;

// CONSTRUCTEUR

public Chronometer() {
listeners = new EventListenerList();
changeEvent = new ChangeEvent(this);
seconds = 0;
minutes = 0;
paused = false;
}

// REQUETES

public int getSeconds() {
return seconds;
}

public int getMinutes() {
return minutes;
}

public boolean isPaused() {
return paused;
}

public ChangeListener[] getChangeListeners() {
return listeners.getListeners(ChangeListener.class);
}

// COMMANDES

public void setSeconds(int s) {
seconds = s;
}

public void setMinutes(int m) {
minutes = m;
}

public void setPaused(boolean b) {
paused = b;
fireStateChanged();
}

public void increment() {
seconds++;
if (seconds == MAX_SECONDS) {
seconds = 0;
minutes++;
}
}

public void penalty() {
seconds += 10;
if (seconds >= MAX_SECONDS) {
minutes++;
seconds -= MAX_SECONDS;
}
}

public void reset() {
seconds = 0;
minutes = 0;
fireStateChanged();
}

public void addChangeListener(ChangeListener listener) {
if (listener == null) {
return;
}
listeners.add(ChangeListener.class, listener);
}

public void removeChangeListener(ChangeListener listener) {
if (listener == null) {
return;
}
listeners.remove(ChangeListener.class, listener);
}

public String toString() {
return String.format("%02d:%02d", minutes, seconds);
}

// OUTILS

protected void fireStateChanged() {
ChangeListener[] listnrs = getChangeListeners();
for (ChangeListener lst : listnrs) {
lst.stateChanged(changeEvent);
}
}
}

我先谢谢你了!

最佳答案

现在看起来这是一个不错的程序!我快速浏览了一下,我相信我找到了问题所在。在 placeComponents 方法中,您交换了布局的候选者和数字键。我还删除了不必要的括号。

private void placeComponents() {
JPanel p = new JPanel(new GridLayout(3, 3));
for (int i = 0; i < 9; i++) {
JPanel q = new JPanel(); {
q.add(candidates[i]);
}
q.setOpaque(false);
p.add(q);
}

p.setOpaque(false);
add(p, CANDIDATES); // was DIGIT

p = new JPanel(new GridBagLayout()); {
p.add(digit, gridBagConstraint);
p.setOpaque(false);
}
add(p, DIGIT); // was CANDIDATES
}

关于java - 使用 MouseListener 的源更改 JLabel 的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724736/

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