Добавление JTextArea перед изображением - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы добавить JTextArea спереди / сверху изображения. Всякий раз, когда я пытаюсь добавить его в кадр, позиционируя его как BorderLayout.CENTER/TOP и т. Д., Текст добавляется над изображением. Когда я попробую frame.add (textArea), все изображение не будет отображаться.

Должен ли я добавлять JTextArea в мой класс ComponentImage?

Это мой код:

Класс GUI:

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

 public class GUILab {

private Image image;
public JTextArea textArea;
public JPanel bottomPanel;
public JTextField jtf;
public JButton updateButton;

public static void main(String[] args) {

    JFrame frame = new JFrame("Frame");

    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    int screenWidth = screenSize.width;
    int screenHeight = screenSize.height;

    int frameWidth = screenWidth / 2;
    int frameHeight = screenHeight / 2;

    frame.setSize(frameWidth, frameHeight);
    frame.setTitle("");
    frame.setLocation(100, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    //Call image
    ComponentImage image = new ComponentImage();
    frame.add(image, BorderLayout.CENTER);

    //TextField: adding to bottomPanel, then add bottomPanel to frame
    JTextArea textArea = new JTextArea(8, 20);
    JPanel bottomPanel = new JPanel();
    JTextField jtf = new JTextField("Test", 25);
    JButton updateButton = new JButton("Update");
    bottomPanel.add(jtf);
    bottomPanel.add(updateButton);

    updateButton.addActionListener(new ActionListener() 
    {            
        public void actionPerformed(ActionEvent event) {
            textArea.append(jtf.getText()+"\n");
            System.out.println(jtf.getText());
        }
    });

    frame.add(bottomPanel, BorderLayout.SOUTH);
    //frame.add(textArea);

    frame.pack();
    frame.setVisible(true);
    }
}

ComponentImage класс:

 package test;

 import java.awt.Graphics;
 import javax.swing.JComponent;
 import java.awt.Dimension;
 import java.awt.Image;
 import javax.swing.ImageIcon;


public class ComponentImage extends JComponent {

    private Image image; 
    private int compWidth=400;
    private int compHeight=300;
    public GUILab guilab;

public void paintComponent(Graphics g) {

    image=new ImageIcon("bg1.jpg").getImage();

    g.drawImage(image, 0,0,null);

    g.drawString("Test", 100, 120);

    }

public Dimension getPreferredSize() { 
    return new Dimension(compWidth, compHeight);
    }
}

РЕДАКТИРОВАТЬ: Чтобы уточнить: когда текст вводится в TextField и нажата кнопка Обновить, этот текст должен появиться в верхней части изображения

1 Ответ

0 голосов
/ 02 мая 2018
g.drawImage(image, 0,0,null);

Вы рисуете изображение в его реальном размере. Если это ваше реальное требование, просто используйте JLabel с ImageIcon. JLabel по умолчанию отображает изображение в его предпочтительном размере и вычисляет предпочтительный размер этикетки как размер изображения.

Если ваше требование состоит в том, чтобы масштабировать изображение при изменении размера рамки, тогда да, вам нужно будет выполнить пользовательскую покраску, но затем вы должны использовать:

g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

для динамического масштабирования изображения.

Когда я попробовал frame.add (textArea), все изображение не будет отображаться.

При использовании BorderLayout, и вы не указываете ограничение, тогда предполагается BorderLayout.CENTER. Вы не можете добавить два компонента в ЦЕНТР фрейма.

Так что вам нужно добавить текстовую область на панель изображений (либо ваш пользовательский компонент, либо JLabel:

JPanel background = new ComponentImage();
background.setLayout(...);
background.add( textArea );

Обратите внимание, что если вы выполняете пользовательскую рисование на JPanel, для макета по умолчанию устанавливается FlowLayout. Если вы выполняете пользовательское рисование на JComponent, у него не будет менеджера по умолчанию, поэтому вам нужно будет установить его.

...