최근에 Java GUI로 작업하기 시작했습니다.GroupLayout은 포커스 리스너가 포커스를 잃게합니다.
이제 나는이 문제를 해결할 수 없습니다.
+----------------+
| Panel1 | Board |
|________|_______|
| Panel2 | EMPTY |
| | |
+----------------+
내가이 사용을하려고에 의해 시작 :
+----------------+
| Panel1 | Board |
|________| |
| Panel2 | |
| | |
+----------------+
하지만이납니다 : 나는 JPanel
를 확장하고이 같은 ActionListener
(뭔가를) 구현하는 게임 보드를 폐기 할 메인 패널의 GridLayout
내부에 BoxLayout
ed 패널이 있지만 작동하지 않습니다. 그런 다음 GroupLayout
을 찾았습니다. 위의 사례로 안내해 주었고 이사회 수업 시간에 청취자의 초점을 잃어 버렸습니다.
[편집] 보드의 최소 및 권장 크기를 변경하려고 시도했으나 작동하지도 않았습니다.
왜 이런 일이 일어 났는지 말해 줄 수 있습니까?
다시 시작 :
- 왜 그룹 레이아웃이 보드 패널에이 일을합니까? 어쨌든 고칠 수 있니?
- 보드 클래스 내에서 setFocusable (true); 이유는 그룹 레이아웃 내부에있는 후 활동/이벤트를받을 수 없습니다 여기
코드입니다 (그것없이 잘 작동) :
게임 클래스
...
public ConstructorOfTheClassThatExtendsJFrame() {
statusbar = new JLabel(" 0");
panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black));
this.getContentPane().add(panel);
Board board = new Board(this);
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
//Specify automatic gap insertion:
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//PANEL 1
col1 = new JPanel();
col1.setBorder(BorderFactory.createLineBorder(Color.black));
//PANEL 3
col3 = new JPanel();
col3.add(statusbar);
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(col1)
.addComponent(col3))
.addComponent(board)
);
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(col1)
.addComponent(board))
.addComponent(col3)
);
setSize(400, 400);
setResizable(false);
setTitle("GameOn");
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
내 보드 클래스 (
public Board(Game parent) {
setFocusable(true);
curPiece = new Shape();
timer = new Timer(400, this);
timer.start();
statusbar = parent.getStatusBar();
board = new Tetrominoes[BoardWidth * BoardHeight];
addKeyListener(new TAdapter());
clearBoard();
}
...
class TAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
if (!isStarted || curPiece.getShape() == Tetrominoes.NoShape) {
return;
}
int keycode = e.getKeyCode();
if (keycode == 'p' || keycode == 'P') {
pause();
return;
}
if (isPaused)
return;
switch (keycode) {
case KeyEvent.VK_LEFT:
tryMove(curPiece, curX - 1, curY);
break;
case KeyEvent.VK_RIGHT:
tryMove(curPiece, curX + 1, curY);
break;
case KeyEvent.VK_DOWN:
//tryMove(curPiece, curX, curY - 1);
oneLineDown();
break;
case KeyEvent.VK_UP:
tryMove(curPiece.rotateRight(), curX, curY);
break;
case KeyEvent.VK_SPACE:
dropDown();
break;
case 'd':
oneLineDown();
break;
case 'D':
oneLineDown();
break;
case KeyEvent.VK_SHIFT:
newPiece();
break;
}
}
[EDIT])에서 솜 ZetCode 후 전자 조언, 여기에 키 이벤트가 작동 코드의 sscce 버전입니다하지만 정렬이 여전히 잘못 : (여전히이 경우 안녕하세요 세계지만)
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
public class HelloWorldSwing{
private static void createAndShowGUI(){
//Create frame
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black));
frame.getContentPane().add(panel);
//Create the new group layout
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
//We specify automatic gap insertion:
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//PANEL 1
JPanel col1 = new JPanel();
col1.setBorder(BorderFactory.createLineBorder(Color.black));
//PANEL 2
JLabel label2 = new JLabel("Col2");
Board board = new Board(label2, new BorderLayout());
//PANEL 3
JPanel col3 = new JPanel();
JLabel label = new JLabel("Col1");
JLabel label3 = new JLabel("Col3");
col1.add(label);
board.add(label2,BorderLayout.PAGE_END);
col3.add(label3);
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(col1)
.addComponent(col3))
.addComponent(board)
);
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(col1)
.addComponent(board))
.addComponent(col3)
);
frame.setSize(300, 400);
frame.setVisible(true);
}
public static void main(String[] args){
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
그리고
게임 클래스 보드 클래스 : 시간에 대한
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Board extends JPanel implements ActionListener {
JLabel blabel;
public Board(JLabel label, BorderLayout b) {
super(b);
setFocusable(true);
blabel = label;
addKeyListener(new TAdapter());
}
public void actionPerformed(ActionEvent e) {
}
class TAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
switch (keycode) {
case KeyEvent.VK_LEFT:
blabel.setText("Left");
break;
case KeyEvent.VK_RIGHT:
blabel.setText("Right");
break;
case KeyEvent.VK_DOWN:
blabel.setText("Down");
break;
}
}
}
}
감사합니다!
[sscce] (http://sscce.org) 작성 및 게시를 고려하십시오. 포커스가 필요한 JPanels를 볼 때 의심 스럽습니다. 왜 이것이 필요한가? 그리고 GUI 클래스가 리스너 인터페이스를 구현하는 이유는 무엇입니까? 일반적으로 코드를 별도로 유지하면 코드를 유지 관리하기가 더 쉽습니다. –
그리고 레이아웃이 ActionListener 이벤트에 영향을 주어서는 안되기 때문에 뭔가 다른지 또는 틀린 지 궁금합니다. 지금까지 제시 한 정보를 기반으로 말할 수 없으므로 [sscce] (http://sscce.org)가 도움이 될 것입니다 *. –
sscce에 대해서, 나는 내가했던 것보다 더 많이 최소화 할 수 있다고 생각지 않습니다. 텍스트가 퍼지지만 내 영어 때문에, 나는 내 자신을 더 짧게 표현할 수 없다 (나는 생각한다). 어쨌든, 당신이 여전히 너무 크고 간결하지 않다고 생각하면 저에게 말해주세요. 최선을 다할 것입니다. 리스너를 구현하는 GUI에 대해, 이것은 프로그래밍중인 빠른 테트리스입니다. MVC 또는 Command-Kernel 패턴이 없으며 '하드 코드'입니다. –