Java 如何在作为BuffereImage()的JFrame中添加JPanel

Java 如何在作为BuffereImage()的JFrame中添加JPanel,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,到目前为止,我有: 逻辑是: a、 )我将按下“S”键,然后游戏开始 b、 )JTextArea将显示用户的对话(注意:我没有出于调试目的禁用它) c、 )JTextField将是用户将键入文本的字段 我有以下工作代码: package game; //import public class Game extends JFrame { public static final String SERVER_IP = "localhost"; public static final

到目前为止,我有:

逻辑是:

a、 )我将按下“S”键,然后游戏开始

b、 )JTextArea将显示用户的对话(注意:我没有出于调试目的禁用它)

c、 )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();
}
打包游戏;
//进口
公共类游戏扩展JFrame{
公共静态最终字符串服务器\u IP=“localhost”;
公共静态最终整数宽度=1200;
公共静态最终内部高度=800;
公共静态最终整数比例=1;
私人最终整数FPS=60;
私人最终长目标时间=1000/FPS;
专用缓冲映像backBuffer;
公用键盘输入;
私人舞台;
公共字符串用户名=”;
公共游戏客户端;
公共静态博弈;
公共静态字符串消息=”;
私家坦克;
私有javax.swing.JButton jButton1;
私有javax.swing.JPanel jPanel1;
私有javax.swing.JScrollPane-jScrollPane1;
私有javax.swing.JTextArea jTextArea1;
私有javax.swing.JTextField jTextField1;
公共游戏()抛出无头例外{
设置大小(10001000);
addWindowListener(新的WinListener());
setDefaultCloseOperation(关闭时退出);
setLocationRelativeTo(空);
可设置大小(假);
setVisible(真);
//未装饰的刚毛(假);
addKeyListener(输入);
setVisible(真);
}    
公共void init(){
这个游戏=这个;
输入=新键盘输入();
//此.setSize(宽度、高度);
//此.setLocationRelativeTo(空);
//此参数为.setresizeable(false);
预期尺寸尺寸=新尺寸(900,50);
预期尺寸尺寸2=新尺寸(100,50);
jButton1=新JButton(“jButton1”);
jTextArea1=新的JTextArea(6,6);
jTextArea1.立根(02002002000);
JTextArea 1.立根背景(颜色:蓝色);
//jTextArea1.setFocusable(假);
jTextField1=新的JTextField(“jTextField1”);
JPanel panel2=新的JPanel();
panel2.setLayout(新的FlowLayout());
面板2.添加(jTextField1);
面板2.添加(jButton1);
panel2.setBackground(颜色.黑色);//仅用于调试
面板2.设置首选尺寸(预期尺寸);
面板2.设置最大尺寸(预期尺寸);
面板2.设置最小尺寸(预期尺寸);
jPanel1=新的JPanel();
setLayout(新的BoxLayout(jPanel1,BoxLayout.Y_轴));
jPanel1.add(jTextArea1);
jPanel1.add(第2组);
jPanel1.setBackground(Color.RED);//仅用于调试
jPanel1.setPreferredSize(预期尺寸2);
jPanel1.设置最大尺寸(预期尺寸2);
jPanel1.设置最小尺寸(预期尺寸2);
jScrollPane1=新的JScrollPane(jPanel1,JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS);
setContentPane(jScrollPane1);
System.out.println(“init”);
重新验证();
客户端=新游戏客户端(服务器IP,此);
backBuffer=新的BuffereImage(800*比例,600*比例,BuffereImage.TYPE_INT_RGB);
}
公共舞台getStage(){
返回阶段;
}
公共类WinListener扩展了WindowAdapter{
@凌驾
公共无效窗口关闭(WindowEvent e){
断开连接();
系统出口(0);
}
}
公共空间断开连接(){
Packet01Disconnect p=新Packet01Disconnect(用户名);
p、 书面资料(客户);
client.closeSocket();
系统出口(0);
}
私有字体=新字体(“Munro Small”,Font.PLAIN,96);
私有字体font2=新字体(“Munro-Small”,Font.PLAIN,50);
private Font fontError=新字体(“Munro Small”,Font.PLAIN,25);
私有int op=0;
public void updateMenu(){
if(input.up.isPressed()){
如果(op==1){
op=0;
}否则{
op++;
}
input.up.toggle(假);
}else if(input.down.isPressed()){
如果(op==0){
op=1;
}否则{
op--;
}
input.down.toggle(假);
}else if(input.enter.isPressed()&&op==0){
runningMenu=false;
输入.输入.切换(false);
}else if(input.enter.isPressed()&&op==1){
系统出口(0);
}
}
公共菜单(){
Graphics g=getGraphics();
Graphics bbg=backBuffer.getGraphics();
bbg.setFont(字体);
bbg.setColor(颜色:白色);
bbg.抽绳(“样本”,189、180);
bbg.setFont(font2);
如果(op==0){
bbg.setColor(颜色为红色);
bbg.抽绳(“开始”,327378);
bbg.setColor(颜色:白色);
bbg.抽绳(“退出”,342425);
}else if(op==1){
bbg.setColor(颜色:白色);
bbg.抽绳(“开始”,327378);
bbg.setColor(颜色为红色);
bbg.抽绳(“退出”,342425);
}
g、 drawImage(backBuffer,0,0,this);
}
公众抽签(){
Graphics g=getGraphics();
Graphics bbg=backBuffer.getGraphics();
bbg.setColor(颜色为黑色);
bbg.fillRect(0,0,宽度,高度);
阶段。牵引阶段(bbg,本);
对于(坦克t:stage.getPlayers()){
t、 绘制(bbg、比例、本);
}
g、 drawImage(backBuffer,0,0,this);
}
公共无效更新(){
坦克更新(阶段);
stage.update();
}
私人长时间=0;
public void updateLogin(){
if(username.length()<8){
if(input.letter.isPressed()){
username+=(char)input.letter.getKeyCode();
输入.letter.toggle(假);
}
}
if(input.erase.isPressed()&&username.length()>0){
username=username.substring(0,username.length()-1);
输入.擦除.切换(假);
}
if(input.enter.isPressed()&&username.length()>0){
输入.输入.切换(false);
时间=System.currentTimeMillis();
Packet00Login packet=新的Packet00Login(用户名,0,0,0);
packet.writeData(客户端);
}
if(message.equalsIgnoreCase(“连接服务器成功”)){
时间=0;
runningLogin=false;
回来
}
if(message.equalsIgnoreCase(“用户名已存在”)){
drawLogin();
试一试{
睡眠(1000);
}捕获(中断异常例外){
}
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);
            }
        });
    }

}