2014-12-08 70 views
2

到目前为止,我有这样的: enter image description here如何在一个JFrame是一个BufferedImage添加的JPanel()

的逻辑是:

一)我会按keybutton“S”则游戏将开始

二)的JTextArea将显示用户(注的谈话:我没有禁用它用于调试)

三)的JTextField将是该领域的用户键入文本。 。

我有这方面的工作代码:

package game; 

//import 


public class Game extends JFrame { 


public static final String SERVER_IP = "localhost"; 


public static final int WIDTH = 1200; 
public static final int HEIGHT = 800; 
public static final int SCALE = 1; 


private final int FPS = 60; 
private final long targetTime = 1000/FPS; 

private BufferedImage backBuffer; 

public KeyboardInput input; 
private Stage stage; 

public String username = ""; 

public GameClient client; 
public static Game game; 

public static String message = ""; 

private Tank tank; 

private javax.swing.JButton jButton1; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JScrollPane jScrollPane1; 
private javax.swing.JTextArea jTextArea1; 
private javax.swing.JTextField jTextField1; 

public Game() throws HeadlessException { 
    setSize(1000, 1000); 
    addWindowListener(new WinListener()); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setVisible(true); 
    //setUndecorated(false); 
    addKeyListener(input); 
    setVisible(true); 
}  
public void init() { 
    this.game = this; 
    input = new KeyboardInput(); 

    //this.setSize(WIDTH, HEIGHT); 
    //this.setLocationRelativeTo(null); 
    //this.setResizable(false); 


    Dimension expectedDimension = new Dimension(900, 50); 
    Dimension expectedDimension2 = new Dimension(100, 50); 
    jButton1 = new JButton("jButton1"); 

jTextArea1 = new JTextArea(6,6); 
jTextArea1.setBounds(0,200,200,200); 
jTextArea1.setBackground(Color.BLUE); 
//jTextArea1.setFocusable(false); 
jTextField1 = new JTextField("jTextField1"); 
JPanel panel2 = new JPanel(); 
panel2.setLayout(new FlowLayout()); 
panel2.add(jTextField1); 
panel2.add(jButton1); 
panel2.setBackground(Color.BLACK); // for debug only 
panel2.setPreferredSize(expectedDimension); 
panel2.setMaximumSize(expectedDimension); 
panel2.setMinimumSize(expectedDimension); 
jPanel1 = new JPanel(); 
jPanel1.setLayout(new BoxLayout(jPanel1, BoxLayout.Y_AXIS)); 
jPanel1.add(jTextArea1); 
jPanel1.add(panel2); 
jPanel1.setBackground(Color.RED); // for debug only 
jPanel1.setPreferredSize(expectedDimension2); 
jPanel1.setMaximumSize(expectedDimension2); 
jPanel1.setMinimumSize(expectedDimension2); 
jScrollPane1 = new JScrollPane(jPanel1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
setContentPane(jScrollPane1); 

System.out.println("init"); 
revalidate(); 

    client = new GameClient(SERVER_IP, this); 

    backBuffer = new BufferedImage(800* SCALE,600 * SCALE, BufferedImage.TYPE_INT_RGB); 
} 

public Stage getStage() { 
    return stage; 
} 

public class WinListener extends WindowAdapter { 

    @Override 
    public void windowClosing(WindowEvent e) { 
     disconnect(); 
     System.exit(0); 
    } 

} 


public void disconnect() { 
    Packet01Disconnect p = new Packet01Disconnect(username); 
    p.writeData(client); 
    client.closeSocket(); 
    System.exit(0); 
} 

private Font font = new Font("Munro Small", Font.PLAIN, 96); 
private Font font2 = new Font("Munro Small", Font.PLAIN, 50); 
private Font fontError = new Font("Munro Small", Font.PLAIN, 25); 
private int op = 0; 


public void updateMenu() { 
    if (input.up.isPressed()) { 
     if (op == 1) { 
      op = 0; 
     } else { 
      op++; 
     } 
     input.up.toggle(false); 
    } else if (input.down.isPressed()) { 
     if (op == 0) { 
      op = 1; 
     } else { 
      op--; 
     } 
     input.down.toggle(false); 
    } else if (input.enter.isPressed() && op == 0) { 
     runningMenu = false; 
     input.enter.toggle(false); 
    } else if (input.enter.isPressed() && op == 1) { 
     System.exit(0); 
    } 
} 


public void drawMenu() { 
    Graphics g = getGraphics(); 
    Graphics bbg = backBuffer.getGraphics(); 
    bbg.setFont(font); 
    bbg.setColor(Color.white); 

    bbg.drawString("Sample", 189, 180); 
    bbg.setFont(font2); 
    if (op == 0) { 
     bbg.setColor(Color.red); 
     bbg.drawString("Start", 327, 378); 
     bbg.setColor(Color.white); 
     bbg.drawString("Quit", 342, 425); 
    } else if (op == 1) { 
     bbg.setColor(Color.white); 
     bbg.drawString("Start", 327, 378); 
     bbg.setColor(Color.red); 
     bbg.drawString("Quit", 342, 425); 
    } 

    g.drawImage(backBuffer, 0, 0, this); 
} 

public void draw() { 
    Graphics g = getGraphics(); 
    Graphics bbg = backBuffer.getGraphics(); 
    bbg.setColor(Color.black); 
    bbg.fillRect(0, 0, WIDTH, HEIGHT); 
    stage.drawStage(bbg, this); 
    for (Tank t : stage.getPlayers()) { 
     t.draw(bbg, SCALE, this); 
    } 
    g.drawImage(backBuffer, 0, 0, this); 
} 


public void update() { 

    tank.update(stage); 

    stage.update(); 
} 

private long time = 0; 


public void updateLogin() { 
    if (username.length() < 8) { 
     if (input.letter.isPressed()) { 
      username += (char) input.letter.getKeyCode(); 
      input.letter.toggle(false); 
     } 
    } 

    if (input.erase.isPressed() && username.length() > 0) { 
     username = username.substring(0, username.length() - 1); 
     input.erase.toggle(false); 
    } 

    if (input.enter.isPressed() && username.length() > 0) { 
     input.enter.toggle(false); 
     time = System.currentTimeMillis(); 
     Packet00Login packet = new Packet00Login(username, 0, 0, 0); 
     packet.writeData(client); 
    } 

    if (message.equalsIgnoreCase("connect server success")) { 
     time = 0; 
     runningLogin = false; 
     return; 
    } 

    if (message.equalsIgnoreCase("Username already exists")) { 
     drawLogin(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
     } 
     message = ""; 
     username = ""; 
     time = 0; 
    } 

    if (message.equalsIgnoreCase("Server full")) { 
     drawLogin(); 
     try { 
      Thread.sleep(2000); 
     } catch (Exception e) { 
     } 
     System.exit(0); 
    } 

    if (time != 0 && message.equals("") && (System.currentTimeMillis() - time) >= 5000) { 
     message = "cannot connect to the server"; 
     drawLogin(); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException ex) { 
     } 
     message = ""; 
     time = 0; 
    } 
} 


public void drawLogin() { 
    Graphics g = getGraphics(); 
    Graphics bbg = backBuffer.getGraphics(); 
    bbg.setColor(Color.black); 
    bbg.fillRect(0, 0, 800, 600); 
    bbg.setColor(Color.red); 
    bbg.setFont(fontError); 
    bbg.drawString(message, 100, 100); 
    bbg.setFont(font2); 
    bbg.setColor(Color.white); 
    bbg.drawString("Username", 284, 254); 
    bbg.setColor(Color.red); 
    bbg.drawString(username, 284, 304); 
    g.drawImage(backBuffer, 0, 0, this); 
} 


public static String waitPlayers = "Waiting for others players"; 
public String auxWaitPlayers = waitPlayers; 
public static int quantPlayers = 0; 

public class StringWait extends Thread { 

    public void run() { 
     while (true) { 
      try { 
       waitPlayers = "waiting for others players"; 
       Thread.sleep(1000); 
       waitPlayers = "waiting for others players."; 
       Thread.sleep(1000); 
       waitPlayers = "waiting for others players.."; 
       Thread.sleep(1000); 
       waitPlayers = "waiting for others players..."; 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
      } 
     } 
    } 
} 


public void updateWaitPlayers() { 
    if (quantPlayers == 1) { 
     runningWaitPlayer = false; 
    } 
} 


public void drawWaitPlayers() { 
    Graphics g = getGraphics(); 
    Graphics bbg = backBuffer.getGraphics(); 
    bbg.setColor(Color.black); 
    bbg.fillRect(0, 0, 800, 600); 
    bbg.setColor(Color.white); 
    bbg.setFont(fontError); 
    bbg.drawString(waitPlayers, 100, 100); 
    g.drawImage(backBuffer, 0, 0, this); 
} 

public boolean runningMenu = true, runningLogin = true, runningWaitPlayer = true, runningGame = true; 

public int op2 = 0; 


public void start() { 
    long start; 
    long elapsed; 
    long wait; 
    init(); 
    while (true) { 
     runningGame = true; 
     runningMenu = true; 
     runningWaitPlayer = true; 
     runningLogin = true; 
     switch (op2) { 
      //.. 
    } 
} 


public void setGameState(boolean state) { 
    //... 
} 

public static void main(String[] args) throws InterruptedException { 
    Game g = new Game(); 
    Thread.sleep(1000); 
    g.start(); 
} 

}

而这些是我的目标接口:enter image description here

我希望有人能帮助我与我的问题。

回答

4
  • 设置“主”容器布局管理BorderLayout
  • 在此,在BorderLayout.CENTER位置
  • 创建另一个(“互动”)容器中,并设置它的布局管理BorderLayout添加GameInterface,加这对“主”容器的位置BorderLayout.SOUTH
  • 包裹JTextAreaJScrollPane,并把它添加到你的“互动”容器的BorderLayout.CENTER位置
  • 创建另一个容器(“消息”),这可以使用GridBagLayout。在此添加JTextField(与GridBagConstraints#weightx设置为0GridBagConstraints#weightx设置为1),并添加按钮,下一个单元格(GridBagConstraints#gridx设置为1GridBagConstraints#weightx设置为0

有关详细信息,请参阅:

注:

Graphics g = getGraphics();并不怎么风俗画应该做的。相反,请覆盖JPanel等组件的paintComponent,然后在其中执行自定义绘画!

更多细节参见

Test layout

import java.awt.BorderLayout; 
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 javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JPanel master = new JPanel(new BorderLayout()); 
       master.setBackground(Color.BLUE); 

       JPanel gameInterface = new JPanel() { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(400, 400); 
        } 
       }; 
       gameInterface.setBackground(Color.MAGENTA); 

       master.add(gameInterface); 

       JPanel interactions = new JPanel(new BorderLayout()); 
       interactions.add(new JScrollPane(new JTextArea(5, 20))); 

       JTextField field = new JTextField(15); 
       JButton btn = new JButton("Button"); 

       JPanel message = new JPanel(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridx = 0; 
       gbc.weightx = 1; 
       gbc.fill = GridBagConstraints.HORIZONTAL; 
       message.add(field, gbc); 
       gbc.gridx = 1; 
       gbc.weightx = 0; 
       message.add(btn, gbc); 

       interactions.add(message, BorderLayout.SOUTH); 

       master.add(interactions, BorderLayout.SOUTH); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(master); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

是否有可能帮助我将其实现为代码?对不起,我是Java新手,我的母语是C.我试图理解你的概念,但大多数我不知道如何在Java中操作接口。 – jt25 2014-12-08 02:29:17

+0

您遇到的主要问题是使用'getGraphics',这不是如何执行自定义绘画,请查看最后两个链接以了解更多详细信息 – MadProgrammer 2014-12-08 02:35:13

+0

我会在该方法中选择什么来定义? Graphics g = getGraphics();或者Graphics bbg = backBuffer.getGraphics(); ?我怎么称呼它? – jt25 2014-12-08 03:13:57

相关问题