2011-11-06 143 views
0

我试图在JPanel顶部放置一个.jpg图标,以表示板上的一块电路板。我有一个包含.java文件的GUI文件夹和另一个包含.jpg文件的文件夹。在JPanel顶部添加JLabel

- 主要Edit-- 示例代码

当方点击白色图标是为了放置,然后黑色等等等等,这是什么即时试图实现

一个非常基本的例子
import java.awt.Dimension; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class gui extends JFrame implements MouseListener { 

/** 
* 
*/ 
private static final long serialVersionUID = -973341728129968945L; 
JLayeredPane layeredPane; 
JPanel board; 
JLabel piece; 
int numSquares; 
private boolean currentPlayer; 

public gui(){ 

    Dimension boardSize = new Dimension(600, 600); 

    numSquares = 6; 
    currentPlayer = true; 

    layeredPane = new JLayeredPane(); 
    getContentPane().add(layeredPane); 
    layeredPane.setPreferredSize(boardSize); 
    layeredPane.addMouseListener(this); 

    board = new JPanel(); 
    layeredPane.add(board, JLayeredPane.DEFAULT_LAYER); 

    board.setLayout(new GridLayout(numSquares, numSquares)); 
    board.setPreferredSize(boardSize); 
    board.setBounds(0, 0, boardSize.width, boardSize.height); 

    for (int i = 0; i < (numSquares * numSquares); i++) { 
     JPanel square = new JPanel(new BorderLayout()); 
     square.setBorder(BorderFactory.createLineBorder(Color.black)); 
     square.setBackground(Color.green); 
     board.add(square); 


    } 



} 

public static void main(String[] args) { 
     JFrame frame = new gui(); 
     frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 



@Override 
public void mouseClicked(MouseEvent e) { 
    JPanel temp = (JPanel)board.findComponentAt(e.getX(), e.getY()); 
    System.out.println(e.getX() + " " + e.getY()); 

    if(currentPlayer){ 
     ImageIcon white = new ImageIcon("l/Images/white.jpg"); 
     piece = new JLabel(white); 
     temp.add(piece); 
    } 
    else{ 
     ImageIcon black = new ImageIcon("/Images/black.jpg"); 
     piece = new JLabel(black); 
     temp.add(piece); 
    } 
    currentPlayer = !currentPlayer; 


} 


@Override 
public void mouseEntered(MouseEvent e) { 


} 

@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseReleased(MouseEvent e) { 

} 




} 
+0

我删除了我的答案,因为我看到你已经使用JPanels作为电路板的单元。我认为你可能需要创建并向我们展示一个[sscce](http://sscce.org),以便我们能够帮助你。 –

+0

没有任何东西可以显示。代码运行时,会创建一个6乘6的黑板背景。然后,当一个cellis点击一个令牌(白色或黑色)是为了放置。但没有任何反应。 – CNevin561

+0

如果你发布了可编译的,可运行的代码,我们可以更容易地研究它,理解它,修改它,并可能帮助你纠正它。由你决定。 –

回答

4

如果添加或删除容器中的组件,请不要忘记重新验证并重新绘制。我已经修改了您的SSCCE,并且已经摆脱了使用图像使其无法访问您的图像文件(像我一样)的需要。变化由// !!评论中指出:

import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 

public class Gui2 extends JFrame implements MouseListener { 

    private static final long serialVersionUID = -973341728129968945L; 
    JLayeredPane layeredPane; 
    JPanel board; 
    JLabel piece; 
    int numSquares; 
    private boolean currentPlayer; 

    // !! 
    private ImageIcon whiteIcon; 
    private ImageIcon blackIcon; 

    public Gui2() { 
     // !! 
     whiteIcon = createIcon(Color.white); 
     blackIcon = createIcon(Color.black); 

     Dimension boardSize = new Dimension(600, 600); 

     numSquares = 6; 
     currentPlayer = true; 

     layeredPane = new JLayeredPane(); 
     getContentPane().add(layeredPane); 
     layeredPane.setPreferredSize(boardSize); 
     layeredPane.addMouseListener(this); 

     board = new JPanel(); 
     layeredPane.add(board, JLayeredPane.DEFAULT_LAYER); 

     board.setLayout(new GridLayout(numSquares, numSquares)); 
     board.setPreferredSize(boardSize); 
     board.setBounds(0, 0, boardSize.width, boardSize.height); 

     for (int i = 0; i < (numSquares * numSquares); i++) { 
     // !! JPanel square = new JPanel(new BorderLayout()); 
     JPanel square = new JPanel(new GridBagLayout()); // !! 

     square.setBorder(BorderFactory.createLineBorder(Color.black)); 
     square.setBackground(Color.green); 
     square.setName(String.format("[%d, %d]", i % numSquares, i 
      /numSquares)); // !! 
     board.add(square); 

     } 

    } 

    // !! 
    private ImageIcon createIcon(Color color) { 
     int width = 40; 
     int height = width; 
     BufferedImage img = new BufferedImage(width, height, 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(color); 
     g2.fillOval(0, 0, width, height); 
     g2.dispose(); 
     ImageIcon icon = new ImageIcon(img); 
     return icon; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new Gui2(); 
     frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    @Override 
    // !! 
    public void mousePressed(MouseEvent e) { 
     JPanel temp = (JPanel) board.findComponentAt(e.getX(), e.getY()); 
     System.out.println(e.getX() + " " + e.getY()); 
     System.out.println(temp.getName()); // !! 

     if (currentPlayer) { 
     // !! ImageIcon white = new ImageIcon("l/Images/white.jpg"); 
     // !! piece = new JLabel(white); 
     piece = new JLabel(whiteIcon); // !! 
     temp.add(piece); 
     } else { 
     // !! ImageIcon black = new ImageIcon("/Images/black.jpg"); 
     // !! piece = new JLabel(black); 
     piece = new JLabel(blackIcon); // !! 
     temp.add(piece); 
     } 
     temp.revalidate(); // !! 
     temp.repaint(); // !! 
     currentPlayer = !currentPlayer; 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

} 

而且类名应该大写,也应再次进行ImageIcons一次。同样,一个ImageIcon可以被许多JLabel共享。您还需要响应mousePressed而不是mouseClicked,因为mouseClicked可能会非常繁琐,特别是在按下鼠标和释放鼠标之间移动鼠标时。

希望你也看到了SSCCE的价值。 :)

+0

轻微的非编程建议 - 用字母A-H(对于列)和数字1-8(对于该行)命名方块。例如白王从E1开始。就像在真正的国际象棋。 – user949300

+0

其实我认为OP创造的游戏是Reversi,而不是国际象棋,但是如果我的记忆为我服务,那么队伍和文件的命名与国际象棋相同。 –

+0

发布SSCCE – mKorbel