2016-01-03 4 views
0

Так что мой код уже делает начальное меню из кнопок и ярлыка. Когда одна из кнопок нажата, я хочу удалить все (что она делает) и показать новую метку и кнопку. Только новые элементы не появляются, пожалуйста, помогитеДобавление Jbuttons и Jlabel

public void HighScoreScreen(String HighScores){ 
    //first we need to get rid of what's already there (this works) 
    remove(title); 
    remove(newGameButton); 
    remove(twoPlayerButton); 
    remove(highScore); 

    //now adding what I want to show (doesn't work) 
    highScoreSheet = new JLabel(HighScores); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    add(highScoreSheet, gbc); 

    menu = new JButton("Menu"); 
    gbc.gridx = 0; 
    gbc.gridx = 1; 
    add(menu, gbc); 
    repaint(); 
} 

Я думаю, что это все, что релевантно, но если вам нужен код, где я первый сделать меню здесь:

public GUI(){ 
    super("Snake Game"); 

    setLayout(new GridBagLayout()); 

    gbc.insets = new Insets(20, 20, 0, 0); 

    title = new JLabel("SNAKE"); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    add(title, gbc); 

    newGameButton = new JButton("New Game"); 
    gbc.gridx = 0; 
    gbc.gridy = 1; 
    add(newGameButton, gbc); 

    twoPlayerButton = new JButton("2 player Mode"); 
    gbc.gridx = 0; 
    gbc.gridy = 2;  
    add(twoPlayerButton, gbc); 

    highScore = new JButton("HighScores"); 
    gbc.gridx = 0; 
    gbc.gridy = 3;   
    add(highScore, gbc); 

    ButtonHandler handler = new ButtonHandler(); 

    newGameButton.addActionListener(handler); 
    twoPlayerButton.addActionListener(handler); 
    highScore.addActionListener(handler); 

} 

Действие Листер это код относится к классу внутри этого класса и отлично работает, когда нажата рекорда, он будет делать свою вещь, а затем вызовет первый код, который я показал.

И, наконец, здесь главное, только в случае, если вам это нужно:

public class SnakeGame extends Canvas implements Runnable { 

public boolean read = false; 

public SnakeGame(){ 

    GUI frame = new GUI(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400,300); 
    frame.setVisible(true); 
} 

public void run(){ 

} 
public static void main(String[] args) { 
    SnakeGame Game = new SnakeGame(); 

} 
} 
+0

Пожалуйста, примите решение (http://meta.stackexchange.com/a/5235/155831), если это поможет решить проблему. –

ответ

3

Не следует смешивать компоненты AWT в Swing-приложении. Холст AWT. Используйте JPanel для пользовательской росписи.

Основной код при добавлении/удалении компонентов на видимой GUI является:

panel.remove(...); 
panel.add(...); 
panel.revalidate(); // to invoke the layout manager 
panel.repaint(); 

Если вы не вызовите менеджера компоновки, то компоненты имеют размер 0, так что нет ничего рисовать.

+0

.... или обменять с помощью [CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html). 1+ –

+0

... и я согласен с @HovercraftFullOfEels, в этом случае, потому что вы заменяете ВСЕ компоненты, вы должны просто менять панели с помощью «CardLayout». Поэтому я бы взял несколько лишних минут, чтобы перестроить ваш код, чтобы использовать CardLayout вместо того, чтобы просто использовать предлагаемое мной предложение. – camickr

+0

Я не уверен, что вы имеете в виду о смешении AWT и качели, но я добавил строку revalidate, и теперь она отлично работает благодаря большому количеству :) –

Смежные вопросы