2015-06-13 6 views
0

Я программирую римейк игры с кликером для файлов cookie, и когда я масштабирую окно JFrame, появляется что-то белое. Он исчезает, как только вы наводите курсор на кнопку (когда обновляется), и мне нужно это исправить, потому что она делает то же самое при запуске игры.Почему мое окно JFrame делает это? (Проверьте описание)

Вот скриншот (Немасштабируемая | масштабируется): http://s3.postimg.org/xomifomhf/bandicam_19.png

это весь код этой игры:

package cookieclicker.tominocz; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

import javax.swing.BorderFactory; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 

    public static int num1; 

    static Icon icon1 = new ImageIcon("cookie.png"); 
    static JButton b1 = new JButton(icon1); 
    static JButton b2 = new JButton("You got " + num1 + " Cookies!"); 

    @SuppressWarnings("serial") 
    public static void main(String[] args) { 

     File save = new File(".\\gamesave.cookieclicker"); 
     if (save.exists()) { 
      loadGame(); 
     } 

     JFrame f = new JFrame("Cookie Clicker Beta v0.1"); 
     b2.setBackground(Color.cyan); 
     b2.setPreferredSize(new Dimension(10000, 14)); 

     JPanel buttonPanel1 = new JPanel(new GridLayout(1, 1)); 
     buttonPanel1.setBackground(Color.DARK_GRAY); 
     b2.setEnabled(false); 
     b2.setBorder(null); 
     buttonPanel1.add(b2); 

     JPanel buttonPanel2 = new JPanel(new GridLayout(1000, 1)); 
     buttonPanel2.setBackground(Color.DARK_GRAY); 
     buttonPanel2.setEnabled(false); 
     buttonPanel2.add(new JButton("Grandma")); 
     buttonPanel2.add(new JButton("")); 
     buttonPanel2.add(new JButton("")); 

     JPanel east = new JPanel(new GridBagLayout()); 
     JPanel north = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.NORTH; 
     gbc.weighty = 1; 

     north.add(buttonPanel1, gbc); 
     east.add(buttonPanel2, gbc); 

     JPanel center = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(200, 200); 
      } 
     }; 
     center.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

     f.add(east, BorderLayout.EAST); 
     f.add(north, BorderLayout.NORTH); 
     f.add(center); 

     f.pack(); 

     f.setSize(600, 400); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     b1.setBackground(Color.lightGray); 
     b1.setBorder(null); 
     f.add(b1); 
     b1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Object source = e.getSource(); 
       if (source instanceof JButton) { 
        addCookies(); 
       } 
      } 
     }); 
    } 

    public static void addCookies() { 

     saveGame(); 

     b2.setText("You got " + ++num1 + " Cookies!"); 

     if (num1 == 1) { 
      b2.setText(" You got " + 1 + " Cookie! "); 
     } else { 
      b2.setText("You got " + num1 + " Cookies!"); 
     } 
     System.out.println(num1); 
    } 

    public static void saveGame() { 
     try { 

      BufferedWriter writer = new BufferedWriter(new FileWriter(
        ".\\gamesave.cookieclicker")); 
      writer.write(String.valueOf(1 + num1)); 

      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void loadGame() { 
     try (BufferedReader br = new BufferedReader(new FileReader(
       ".\\gamesave.cookieclicker"))) { 
      String SavedGame; 

      while ((SavedGame = br.readLine()) != null) { 
       num1 = Integer.parseInt(SavedGame); 
       b2.setText("You got " + num1 + " Cookies!"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

А также другая вещь, что темно-серая полоса скрывается 3 кнопки , Не считайте 4-й, это тот, который показывает количество файлов cookie, которые у вас есть :).

Теперь, где может возникнуть проблема?

+0

Белая панель - это панель 'center'. Удалите его, если он вам не нужен. – Tom

+0

ой, что помогло. Спасибо! :) –

ответ

2

У вас есть два компонента, в которых есть координаты CENTRE кадра BorderLayout, center и b1.

b1, являющийся последним добавленным компонентом, получает внимание менеджера компоновки и выставляется при изменении размера рамки, center не является и остается на последнем размере/позиции, на которой он был установлен (поскольку вы (pack), что заставило фрейм к макету его дочерние компоненты, но после этого вы добавили b1).

BorderLayout может управлять только один компонент на каждом из его пяти заранее определенных позиций

Принимают решение о том, кто должен быть в центре ...

Вы также должны иметь чтения из Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? и прекратите возиться с предпочтительным размером ваших компонентов, позвольте им принимать собственные решения в сочетании с соответствующими менеджерами макетов

Я также рекомендую вам перемещать содержимое вашего метода main где-нибудь еще (может быть конструктором класса) , это Кстати, вы поля не должны быть static и решить массу других вопросов, которые вы могли бы иметь в будущем

2

Прежде всего:

b2.setPreferredSize(new Dimension(10000, 14)); 

Не указать предпочтительные размеры для компонентов. Каждый компонент отвечает за определение своего собственного предпочтительного размера. Пусть менеджер компоновки определит размер.

JPanel buttonPanel2 = new JPanel(new GridLayout(1000, 1)); 

Не используйте случайные числа при определении GridLayout. Если вам нужен один столбец, просто используйте: new GridLayout(0, 1). Теперь все добавленные компоненты будут отображаться в первой строке.

Теперь для вашей проблемы:

f.add(center); 
f.pack(); 

Вы добавить пустую панель в ЦЕНТРЕ BorderLayout. Затем вы устанавливаете фрейм, чтобы теперь панель имела действительный размер.

f.add(b1); 

Но затем вы добавляете второй компонент в «ЦЕНТР». Однако BorderLayout будет управлять размером последнего добавленного компонента.

Swing будет рисовать() последний компонент, добавленный первым, так что кнопка окрашивается, затем панель наносится поверх нее.

Если вы перемещаете мышь по центру, то событие мыши передается на кнопку, и логика опрокидывания вызывается так, что кнопка окрашивается.

Если вы изменяете размер рамки, размер кнопок пересчитывается менеджером компоновки, а компоненты перекрашиваются. Опять же, центральная панель окрашивается последним, поэтому вы видите часть кнопки с панелью сверху.

Я не знаю, почему у вас есть центральная панель, поэтому я не могу сделать конкретное предложение, кроме как сказать, избавиться от него. Опять же основная проблема заключается в том, что вы пытаетесь добавить два компонента в центр. Не делай этого!

+0

ok, но теперь я хочу добавить кнопку, которая не растягивалась. кнопка cookie, которую вы видите на картинке, - это печенье и вся светло-серая часть. , поэтому я хочу просто добавить квадрат посередине серого фона. Не могли бы вы рассказать мне, как это сделать? –