2015-06-05 3 views
1

У меня возникла проблема с текстовым полем JFrame.
Я пытаюсь сделать игру в словах, но проблема в том, что когда я пытаюсь создать текстовое поле, чтобы установить ввод, а затем проверить, правильно ли это слово, у меня есть слово, которое было закрыто.
Проблема в том, что когда я пытаюсь добавить Textfield, она исчезает, когда я делаю вещи в JFrame.Текстовое поле, добавленное в Jframe, исчезает, когда графика перерисовывается

public teksti() { 

    setTitle("Hirsipuu"); 
    setSize(leveys,korkeus); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    setVisible(true); 
    setLocationRelativeTo(null); 
    setBackground(Color.white); 
    jp.add(tf); // adding JtextField (JTextField tf = new JTextField(30);) 
    add(jp);   
} 

и мой render(), как это (только для целей тестирования).

private void render() { 
    BufferStrategy bs = this.getBufferStrategy(); // tehdään uusi bufferi 

    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 

    int R = (int) (Math.random()*256); 
    int G = (int)(Math.random()*256); 
    int B= (int)(Math.random()*256); 
    Color randomColor = new Color(R, G, B); 
    Graphics g = bs.getDrawGraphics(); 

    g.drawString("Arvaa sana", 100 , 100); 

    g.setColor(Color.white); 
    g.fillRect(0, 50, leveys, korkeus); 
    g.setColor(randomColor); 
    g.setFont(h); 
// g.drawLine(0,0,liikey*2-1,liikex); 
    for(int i = 0; i < salat.size(); i ++) { 
     g.drawString(salat.get(i),liikex+rand.nextInt(50),liikey+rand.nextInt(50)); 
    } 
    System.out.println(liikex + " " + liikey); 

    g.dispose(); 
    bs.show(); 
    g.dispose(); 
} 

Я могу получить текстовое поле, которое будет отображаться сверху в начале, но затем оно исчезает.
Кто-нибудь знает, есть ли лучший способ сделать это?

+2

Active Rendering ('BufferStrategy') и алгоритм пассивного рендеринга Swing несовместимы друг с другом. Вам нужно будет либо использовать Swing API, либо «BufferStrategy», но не оба: – MadProgrammer

ответ

3
  • Не рисовать прямо в JFrame
  • Вместо этого, если вам нужно сделать фоновое изображение, сделайте это в методе paintComponent в виде JPanel. Это, вероятно, будет работать намного лучше, чем использование BufferStrategy для ваших целей.
  • Затем вы можете добавить такие компоненты, как ваш JTextField, в этот JPanel.
  • Затем добавьте этот JPanel в свой JFrame.
  • Всегда вызывайте метод paintComponent супер в вашем собственном методе paintComponent.
  • Будьте осторожны, чтобы никогда не удалять объект Graphics, данный вам из JVM, например, тот, который передается в ваш метод paintComponent.

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 
import javax.swing.*; 

public class BackgroundPanel extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 600; 
    private static final Font PROMPT_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 
     24); 
    private Paint gradientPaint; 
    private JTextField textField = new JTextField(20); 

    public BackgroundPanel() { 
     int red = (int) (Math.random() * 256); 
     int green = (int) (Math.random() * 256); 
     int blue = (int) (Math.random() * 256); 
     Color color1 = new Color(red, green, blue); 
     red = (int) (Math.random() * 256); 
     green = (int) (Math.random() * 256); 
     blue = (int) (Math.random() * 256); 
     Color color2 = new Color(red, green, blue); 

     gradientPaint = new GradientPaint(0, 0, color1, 20, 20, color2, true); 

     JLabel promptLabel = new JLabel("Input:"); 
     promptLabel.setFont(PROMPT_FONT); 
     add(promptLabel); 
     add(textField); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setPaint(gradientPaint); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.black); 
     g.setFont(PROMPT_FONT); 
     g.drawString("Arvaa sana", 100, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     BackgroundPanel mainPanel = new BackgroundPanel(); 

     JFrame frame = new JFrame("BackgroundPanel"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

Как я уже сказал, я довольно новичок в программировании на Java и всегда использовал эту вещь для буферизации. Возможно, я ошибся. Имейте, чтобы узнать о том, что PaintComponent вещь. Извините за глупый вопрос. –

+0

@henryheino: Пожалуйста, не ошибитесь в моем ответе - никто, менее всего, я никогда не говорил, что ваш вопрос был глупым, поскольку это не глупый вопрос. Эти типы рендеринга используются для разных целей. Какова цель вашего рисунка? Сложная анимация? Или больше простого фонового изображения? Пожалуйста, см. Изменение моего ответа на примере того, что я упоминал. –

+0

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

0

это в основном все это я получил сделано сейчас.

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.Scanner; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class teksti extends JFrame implements Runnable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
ArrayList<String> sanat = new ArrayList<String>(); 
ArrayList<String> salat = new ArrayList<String>(); 
String dir = System.getProperty("user.dir"); 
String pathname = dir + "\\src\\kotus_sanat.txt"; 
Random rand = new Random(); 
Scanner lukija = new Scanner(System.in); 
String syote,salasana,salasana2; 
int leveys=500,korkeus=500; 
int liikex=300, liikey=300; 
Font h = new Font("Helvetica", Font.PLAIN, 18); 
JTextField tf = new JTextField(30); 
JPanel jp = new JPanel(); 
JFrame jf = new JFrame(); 


    public teksti() { 

    setTitle("Hirsipuu"); 
    setSize(leveys,korkeus); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    setVisible(true); 
    setLocationRelativeTo(null); 
    setBackground(Color.white); 
    jp.add(tf); 
    add(jp); 

} 

public static void main(String args[]){ 
    teksti teksti = new teksti(); 
    teksti.start(); 

} 


private void start() { 
    run(); 

} 


public void run() { 


    sanat = lataa(); 
    System.out.println(pathname); 

    System.out.println(sanat.size() + " sanaa ladattu.."); 
    int sanoja=sanat.size(); 



    for (int i = 0; i < 10; i++){ 
    salat.add(sanat.get(rand.nextInt(sanoja))); 
    } 
    System.out.println("salasana on " + salasana); 
    long lastTime = System.nanoTime(); // fps sälää 
    long timer = System.currentTimeMillis(); 
    final double ns = 1000000000.0/60.0; 
    double delta = 0; 
    int frames = 0; 
    int updates = 0; 
    requestFocus(); 

    boolean running=true; 
    while (running){ 
     long now = System.nanoTime(); 
     delta += (now-lastTime)/ns; 
     lastTime = now; 
     while (delta >= 1) { 
      update(); 
      updates++; 
      delta--;  
     } 
     render(); 
     frames++; 

     if (System.currentTimeMillis() - timer > 1000){ 
      timer += 1000; 
      setTitle("Hirsipuu"+ " | " + updates + " ups " + frames + " fps"); 
      updates = 0; 
      frames = 0; 
     } 
    } 
} 

private void update() { 
    liikex = liikex + 1; 
    liikey= liikey - 4; 
    if (liikey>korkeus) 
     liikey = 1; 
    if (liikex>leveys) 
     liikex= 1; 
    if (liikey<20) 
     liikey = korkeus; 


} 
private void render() { 
    BufferStrategy bs = this.getBufferStrategy(); // tehdään uusi bufferi 

    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 


    int R = (int) (Math.random()*256); 
    int G = (int)(Math.random()*256); 
    int B= (int)(Math.random()*256); 
    Color randomColor = new Color(R, G, B); 
    Graphics g = bs.getDrawGraphics(); 



g.drawString("Arvaa sana", 100 , 100); 

g.setColor(Color.white); 
g.fillRect(0, 50, leveys, korkeus); 
    g.setColor(randomColor); 
    g.setFont(h); 
// g.drawLine(0,0,liikey*2-1,liikex); 
    for(int i = 0; i < salat.size(); i ++) { 
    g.drawString(salat.get(i), liikex+rand.nextInt(50),liikey+rand.nextInt(50)); 
     } 
    System.out.println(liikex + " " + liikey); 

g.dispose(); 
bs.show(); 


    g.dispose(); 
} 






private void stop() { 


} 



private void vertaa() { 
    System.out.println("Anna sana niin tarkastaan onko se oikea suomenkielinen sana: "); 
    syote = lukija.next(); 

    boolean oikea = false; 
    int i = 0; 
    int z = 0; 
    while (i < sanat.size()) { 
     if (syote.equals(sanat.get(i))) { 
      oikea = true; 
      System.out.println (syote + " on oikea suomalainen sana."); 
      break; 

     } 
     else{ 



     } 

     } 
    if (!oikea) { 
     System.out.println(syote + " ei ole oikea suomalainen sana."); 
    } 


} 



public ArrayList<String> lataa() { 



    String line = null; 

    try { 

     BufferedReader reader = new BufferedReader(new FileReader(pathname)); 
     while((line = reader.readLine()) != null){ 
      sanat.add(line); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return sanat; 
    } 


} 

      vertaa() is not used. 
Смежные вопросы