首先,我使用Jpanel扩展了2个类 Runtest 和 Front 。我试图做的是用keylistener(ENTER键)切换这两个面板,但它只是静态而不是改变,这是目前为止的代码,
import static com.sun.java.accessibility.util.AWTEventMonitor.addKeyListener;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Pactest implements ActionListener , KeyListener{
JFrame frame = new JFrame("Test");
Runtest test ;
Front front = new Front();
CardLayout cardpane = new CardLayout();
int key ;
public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
addKeyListener(this);
this.test = new Runtest();
frame.setLayout(cardpane);
frame.setSize(355, 520);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(front);
frame.add(test);
frame.setVisible(true);
frame.setResizable(false);
cardpane.show(front, "1");
}
@Override
public void actionPerformed(ActionEvent ae) {
if(key == KeyEvent.VK_ENTER){
cardpane.next(frame);
}
}
@Override
public void keyTyped(KeyEvent ke) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void keyPressed(KeyEvent ke) {
key = ke.getKeyCode();
}
@Override
public void keyReleased(KeyEvent ke) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public static void main(String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run(){
new Pactest() ;
}
});
}
答案 0 :(得分:3)
您的代码不应该编译,因为您在没有此方法的类中调用addKeyListener(...)
,因为它不是从Component或JComponent扩展的:
public class Pactest implements ActionListener , KeyListener{
JFrame frame = new JFrame("Test");
Runtest test ;
Front front = new Front();
CardLayout cardpane = new CardLayout();
int key ;
public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
addKeyListener(this);
将来,如果您要询问有编译问题的代码,请告诉我们这些问题,发布所有错误消息,并指出哪些行与错误有关。
一旦解决了这个问题,更好的解决方案就是使用Key Bindings,因为使用Key Bindings可以解决KeyListeners关注的大多数问题。请查看Key Bindings Tutorial了解更多信息。
更具体的建议:
答案 1 :(得分:1)
HovercraftFullOfEels是正确的+1,您不应该使用KeyListener
执行此任务,只有很多与当前焦点相关的问题......
您还没有正确使用CardLayout
,请仔细查看How to Use CardLayout了解详情。
我对你的想法的总体问题是对用户来说并不明显......除非他们“知道”他们必须按 Enter ,他们将如何知道如何移动到下一个观点。即使这样,如果组件(如文本组件或按钮)正在使用 Enter 来满足它自己的需要,这可能会阻止您的密钥监听器/绑定被充分通知,更糟糕的是,使用它在他们准备好之前到下一个观点......
另一种选择可能是提供一个“下一步”按钮,该按钮被设置为“默认”按钮,它提供相同的功能,但也提供了用户可以理解他们正在做什么的方法...... / p>
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Pactest {
JFrame frame = new JFrame("Test");
JLabel test = new JLabel("RunTest");
JLabel front = new JLabel("Front");
CardLayout cardpane = new CardLayout();
int key;
private JButton next;
private JPanel cards;
public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
cards = new JPanel(cardpane);
cards.add(front, "1");
cards.add(test, "2");
frame.add(cards);
frame.setSize(355, 520);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
cardpane.show(cards, "1");
next = new JButton("Next");
frame.add(next, BorderLayout.SOUTH);
next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardpane.next(cards);
}
});
frame.getRootPane().setDefaultButton(next);
}
public static void main(String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new Pactest();
} catch (IOException | UnsupportedAudioFileException | LineUnavailableException ex) {
Logger.getLogger(Pactest.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
请查看How to Use Root Panes了解详情