2014-06-17 35 views
1

我正在制作一个战列舰程序,并且遇到了轻微的事故。我想标记两个网格(用户和计算机),所以我使用GridBagLayout来控制组件的大小。现在,当我将文本居中放置在标签中间时,文本没有任何作用,它保持在同一个地方。这是我的代码:图形界面文本对齐

package buttongrid; 

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import java.net.MalformedURLException; 
import java.net.URL; 
import javax.swing.BorderFactory; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 
import javax.swing.border.Border; 

public class ButtonGrid { 

     JFrame frame=new JFrame(); //creates frame 
     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     JPanel panel3 = new JPanel(); 
     JPanel panel4 = new JPanel(); 
     JPanel panel5 = new JPanel(); 
     JPanel panel6 = new JPanel(); 
     JLabel label1 = new JLabel(); 
     JLabel label2 = new JLabel(); 
     JLabel[][] grid; //names the grid of buttons 
     JLabel[][] enemyGrid; 
     String COLS = "ABCDEFGHIJK"; 
     GridBagConstraints c = new GridBagConstraints(); 
     Border border = BorderFactory.createLineBorder(Color.BLACK, 1); 

     public ButtonGrid() throws MalformedURLException{ //constructor 
      URL urlPic = new URL("http://i47.tinypic.com/14wswi9.gif"); 
      ImageIcon waterPic = new ImageIcon(urlPic); 

       frame.setLayout(new GridBagLayout()); //set layout 
       frame.setResizable(false); 

       //ADDING TOP LEFT PANEL 
       label1.setText("Your Grid"); 
       label1.setHorizontalTextPosition(SwingConstants.CENTER); 
       label1.setVerticalTextPosition(SwingConstants.CENTER); 
       panel4.add(label1); 
       panel4.setBorder(border); 
       c.gridx = 0; 
       c.gridy = 0; 
       c.ipady = 10; 
       frame.add(panel4, c); 

       //ADDING TOP MIDDLE PANEL 
       panel5.setBorder(border); 
       c.gridx = 1; 
       c.gridy = 0; 
       c.ipady = 10; 
       frame.add(panel5, c); 

       //ADDING TOP MIDDLE PANEL 
       label2.setText("Enemy Grid"); 
       label2.setHorizontalTextPosition(SwingConstants.CENTER); 
       label2.setVerticalTextPosition(SwingConstants.CENTER); 
       panel6.add(label2); 
       panel6.setBorder(border); 
       c.gridx = 2; 
       c.gridy = 0; 
       c.ipady = 10; 
       frame.add(panel6, c); 

       //USER GRID 
       c.gridx = 0; 
       c.gridy = 1; 
       panel1.setLayout(new GridLayout(11,11)); 
       grid=new JLabel[11][11]; //allocate the size of grid 
       for(int y=0; y<11; y++){ 
         for(int x=0; x<11; x++){ 
          ImageIcon icon2 = new ImageIcon(new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB)); 
           grid[x][y]= new JLabel(icon2); 
           grid[x][y].setBorder(border); 
           panel1.add(grid[x][y]); 
         } 
       } 

       frame.add(panel1, c); 

       for(int y=1; y<11; y++){ 
        grid[y][0].setText(Integer.toString(y)); 
        grid[y][0].setHorizontalTextPosition(SwingConstants.CENTER); 
         for(int x=1; x<11; x++){ 
          grid[x][y].setIcon(waterPic); 
         } 
       } 

       for(int x = 1; x < 11; x++){ 
        grid[0][x].setText(COLS.substring(x - 1, x)); 
        grid[0][x].setHorizontalTextPosition(SwingConstants.CENTER); 
       } 

       //EMPTY SPACE IN BETWEEN GRIDS 
       c.fill = GridBagConstraints.VERTICAL; 
       c.gridx = 1; 
       c.gridy = 1; 
       c.ipadx = 10; 
       panel2.setBorder(border); 
       frame.add(panel2, c); 

       //ENEMY GRID 
       c.gridx = 2; 
       c.gridy = 1; 
       panel3.setLayout(new GridLayout(11,11)); 
       enemyGrid=new JLabel[11][11]; //allocate the size of grid 
       for(int y=0; y<11; y++){ 
         for(int x=0; x<11; x++){ 
          ImageIcon icon2 = new ImageIcon(new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB)); 
           enemyGrid[x][y]= new JLabel(icon2); // 
           enemyGrid[x][y].setBorder(border); 
           panel3.add(enemyGrid[x][y]); // 
         } 
       } 

       frame.add(panel3, c); 

       for(int y=1; y<11; y++){ 
        enemyGrid[y][0].setText(Integer.toString(y)); 
        enemyGrid[y][0].setHorizontalTextPosition(SwingConstants.CENTER); 
         for(int x=1; x<11; x++){ 
          enemyGrid[x][y].setIcon(waterPic); 
         } 
       } 

       for(int x = 1; x < 11; x++){ 
        enemyGrid[0][x].setText(COLS.substring(x - 1, x)); 
        enemyGrid[0][x].setHorizontalTextPosition(SwingConstants.CENTER); 
       } 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); //sets appropriate size for frame 
       frame.setVisible(true); //makes frame visible 
     } 
     public static void main(String[] args) throws MalformedURLException{ 
       new ButtonGrid();//makes new ButtonGrid with 2 parameters 
     } 
} 

我在框架中的每个组件周围都有一个边框,只是为了使事情更容易。

+0

其中JLabel ??。 –

回答

3

我假设你指的是标题标签...

enter image description here

这已经引起布局管理器,而不是标签本身。 JPanel默认使用FlowLayout。考虑使用不同的布局管理器,例如,GridBagLayout例如

JPanel panel4 = new JPanel(new GridBagLayout()); 
JPanel panel6 = new JPanel(new GridBagLayout()); 

enter image description here

如果您想了解标签更多的填充,你可以使用一个CompoundBorder和混合当前边界与EmptyBorder或使用GridBagConstraints定义额外的插图......

例如...

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.insets = new Insets(8, 8, 8, 8); 

//... 
panel4.add(label1, gbc); 
//... 
panel6.add(label2, gbc); 

enter image description here

虽然您可能会获得更好的结果,但会将UI分解为多个部分。网格是可重复的组件,因此首先将网格作为它自己的组件。

你可以使用一个BorderLayout定位标题和网格本身,然后用另一个容器,使用GridLayout让他们并排添加GridPanel S,例如...基于疯狂的建议

+0

+1,用于将面板的布局管理器识别为问题。 – camickr

+0

Ahhh好吧,我明白了,我一定会尝试一下,看看它是否有效,谢谢! – user3741402

2

问题是面板的布局管理器,我会更进一步,并说你甚至不需要JPanel来保存标签。只需将标签直接添加到网格中,然后您甚至需要担心面板。

您可以通过在每个标签上使用边框来控制所需的间距。例如,你可以创建这样一个边框:

Border labelBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10); 

然后代码添加标签到电网将是:

label1.setBorder(labelBorder); 
//panel4.add(label1); 
//panel4.setBorder(border); 
c.gridx = 0; 
c.gridy = 0; 
//c.ipady = 10; 
//frame.add(panel4, c); 
frame.add(label1, c); 

因为你可以只创建一个JLabel没有文字的中间部分。边界将占据整个空间,这将控制两个网格之间的水平空间。

此外,没有必要创建BufferedImages将它们用作图标。网格的大小将取决于您的“水”图像的大小。

要居中在网格中的文本,你应该使用下面的方法:

label.setHorizontalAlignment(SwingConstants.CENTER); 

垂直对齐默认为CENTER,所以你不必担心。

+0

对于BufferedImages的东西,我认为我确实需要它,因为数字行和字母列会比我需要的小,所以我将所有内容都设置为网格中的默认大小,因为没有别的东西会改变。 – user3741402

+0

@ user3741402,单元格大小对于GridLayout中的所有单元格都是相同的。添加到网格中的最大组件决定了网格中所有单元格的大小。 – camickr