2013-05-30 5 views
1

Я делаю игру, и у меня есть несколько панелей внутри рамки. panel4, как предполагается, содержит мое колесо, проблема в том, что panel4 имеет тот же размер, что и все остальные панели на плате, когда мне нужно, чтобы панель4 была намного больше, потому что я хочу, чтобы изображение колеса полностью отображалось, поскольку, поскольку оно стоит, только верхняя часть колеса показывает, когда мне нужно все это, чтобы показать.Как сделать отдельный JPanel больше в JFrame

public static void setUp() throws IOException {   
    frame=new JFrame(); 
    frame.setLayout(new GridLayout(7,1)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocation(290, 5); 
    frame.setSize(1100, 1100); 
    frame.setTitle("Wheel of fortune"); 

    final JPanel scorePanel=new JPanel(); 
    final JPanel namePanel=new JPanel(); 
    final JPanel panel=new JPanel(new GridLayout(1,3,1,1)); 
    final JPanel panel1=new JPanel(); 
    final JPanel panel2=new JPanel(); 
    final JPanel panel3=new JPanel(new GridLayout(2,1,1,1)); 

    panel3.add(new JLabel("Dead letters/phrases:")); 
    panel3.add(LettersOrPhGuessed); 

    scorePanel.add(new JLabel("Score Board:")); 


    final WheelGui test = new WheelGui(); 
    final JPanel panel4=test; 
    panel4.setSize(800, 600);//this does nothing in the program 


    namePanel.add(playerName); 
    frame.getContentPane().add(namePanel); 
    frame.getContentPane().add(scorePanel); 
    frame.getContentPane().add(panel); 
    frame.getContentPane().add(panel4); 
    frame.getContentPane().add(panel2); 
    frame.getContentPane().add(panel1); 
    frame.getContentPane().add(panel3); 
    frame.setVisible(true); 
} 

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

@SuppressWarnings("serial") 
public class WheelGui extends JPanel{ 
ImageIcon image = new ImageIcon("WheelofFortune.JPG");  
JPanel rotationPanel; 
final int WIDTH = 800; 
final int HEIGHT = 600; 
static double degrees; 

public WheelGui() 
{ 
    super(); 
    this.setPreferredSize(new Dimension(WIDTH,HEIGHT)); 
    setBackground(Color.lightGray); 
    setLayout(null); 
    setFocusable(true); 
    rotationPanel = new JPanel(); 

    rotationPanel = new turningCanvas(); 
    rotationPanel.setPreferredSize(new Dimension(image.getIconWidth(),image.getIconHeight())); 
    //rotationPanel.setSize(800,600); 
    add(rotationPanel); 
    rotationPanel.setBounds(WIDTH/8, HEIGHT/8, rotationPanel.getPreferredSize().width, rotationPanel.getPreferredSize().height); 
    degrees = 0; 
} 
public void paintComponent (Graphics g) 
{ 
    super.paintComponent(g); 
} 
public class turningCanvas extends JPanel 
{ 
    public void paintComponent (Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.rotate(Math.toRadians(degrees),image.getIconWidth()/2,image.getIconHeight()/2); 
     image.paintIcon(this, g2d, 0, 0); 

    } 
} 
public void rotate(){ 
    for(int i=0;i<360;i+=4){ 
     degrees++; 
     repaint(); 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

ответ

3

У вас есть несколько проблем ...

Во-первых, вы используете GridLayout. GridLayout будет отображать все компоненты в сетке с распределением одинакового количества пространства для каждого компонента на основе ширины и высоты родительского контейнера. Если вы хотите, чтобы компоненты имели разные размеры, GridLayout - не лучший выбор.

Во-вторых, вы используете setPreferredSize. Это плохая практика, поскольку вы не защищаете себя от возможного того, что какая-то другая часть приложения попытается изменить размер компонента позже.

Вместо этого вы должны переопределить метод getPreferredSize, где это возможно.

Лично я бы рекомендовал GridBagLayout, но вы можете проверить A Visual Guide to Layout Managers для других вариантов

Обновления с примером

Единственным способом я знаю, чтобы делать то, что вы спрашиваете, с использование GridBagLayout, что дает вам гибкость в определении того, сколько отдельных компонентов будет занимать пространство из доступного пространства. Это один из самых гибких и сложных менеджеров компоновки к мастеру ...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 

public class TestLayout25 { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 
       try { 
        setUp(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public static void setUp() throws IOException { 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridBagLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle("Wheel of fortune"); 

     final JPanel scorePanel = new JPanel(); 
     final JPanel namePanel = new JPanel(); 
     final JPanel panel = new JPanel(new GridLayout(1, 3, 1, 1)); 
     final JPanel panel1 = new JPanel(); 
     final JPanel panel2 = new JPanel(); 
     final JPanel panel3 = new JPanel(new GridLayout(2, 1, 1, 1)); 

     panel3.add(new JLabel("Dead letters/phrases:")); 
     panel3.add(createPane(Color.RED)); 

     scorePanel.add(new JLabel("Score Board:")); 


     final WheelGui test = new WheelGui(); 
     final JPanel panel4 = test; 
     panel4.setSize(800, 600);//this does nothing in the program 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     gbc.weightx = 1; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 

     namePanel.add(new JLabel("Blue"), gbc); 
     frame.getContentPane().add(namePanel, gbc); 
     frame.getContentPane().add(scorePanel, gbc); 
     frame.getContentPane().add(panel, gbc); 
     gbc.weighty = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     frame.getContentPane().add(panel4, gbc); 
     gbc.weighty = 0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     frame.getContentPane().add(panel2, gbc); 
     frame.getContentPane().add(panel1, gbc); 
     frame.getContentPane().add(panel3, gbc); 
     frame.setVisible(true); 
    } 

    protected static JPanel createPane(Color color) { 

     JPanel panel = new JPanel(); 
     panel.setBorder(new LineBorder(color)); 
     return panel; 

    } 

    public static class WheelGui extends JPanel { 

     ImageIcon image = new ImageIcon("WheelofFortune.JPG"); 
     JPanel rotationPanel; 
     final int WIDTH = 800; 
     final int HEIGHT = 600; 
     static double degrees; 

     public WheelGui() { 
      super(); 
      this.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
      setBackground(Color.lightGray); 
      setLayout(null); 
      setFocusable(true); 
      rotationPanel = new JPanel(); 

      rotationPanel = new turningCanvas(); 
      rotationPanel.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight())); 
      //rotationPanel.setSize(800,600); 
      add(rotationPanel); 
      rotationPanel.setBounds(WIDTH/8, HEIGHT/8, rotationPanel.getPreferredSize().width, rotationPanel.getPreferredSize().height); 
      degrees = 0; 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
     } 

     public class turningCanvas extends JPanel { 

      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2d = (Graphics2D) g; 
       g2d.rotate(Math.toRadians(degrees), image.getIconWidth()/2, image.getIconHeight()/2); 
       image.paintIcon(this, g2d, 0, 0); 

      } 
     } 

     public void rotate() { 
      for (int i = 0; i < 360; i += 4) { 
       degrees++; 
       repaint(); 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

Спасибо за знания, но есть способ, чтобы в равной степени увеличить размер каждого компонента? –

+0

Что вы подразумеваете под одинаковым увеличением? GridLayout позволит кнопкам занимать все свободное пространство одинаково – MadProgrammer

+0

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

2

Вы используете GridLayout. Макет заботится о размере и местоположении каждого компонента, и вы мало что можете с этим поделать.

Объект GridLayout размещает компоненты в сетке ячеек. Каждый компонент принимает все доступное пространство внутри своей ячейки, и каждая ячейка имеет точно такой же размер.

Вам нужно будет использовать другой макет. GridBagLayout может быть полезным.

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