一起。这是我第一次寻求帮助。
在 java、swing、gridbaglayout 中,我生成了一个包含多个字段的表单。
如果表单出现,所有字段都显示为 1 行。 当一个字段获得焦点并且是 JTextarea 的典型时,它会增长到多行。
一切正常, 但我需要 multipleRowField scrollable。 当焦点丢失时,该字段应该只有 1 行。
最后一次尝试是将 txtfield 放在面板中...
我读了空网页,但找不到解决方案。 也许我犯了一个简单的错误。我希望大家有想法
我会向你展示我的测试代码:
第一个文件
code
package Dynamicgridbag;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.BorderFactory;
public class main {
private static final Border emtyborder = null;
public static void main(String[] args) throws UnsupportedEncodingException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
final JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.getViewport().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.err.println("Change in " + e.getSource());
System.err.println("Vertical visible? " +
scrollPane.getVerticalScrollBar().isVisible());
System.err.println("Horizontal visible? " +
scrollPane.getHorizontalScrollBar().isVisible());
}
});
// panel.add(scrollPane);
buildBasicDetailGrid(panel);
frame.setContentPane(panel);
frame.setSize(800, 600);
frame.setVisible(true);
}
private static void buildBasicDetailGrid(JPanel anchorPanel) {
//
// ------------------------ GridBag------------------------------
//
anchorPanel.setLayout(new GridBagLayout());
GridBagConstraints constrains = new GridBagConstraints();
int rows = 10;
//
// define basic grid count of fields (for every column one Row and one NullRol
//
for (int i = 0; i <= rows * 2 + 2; i += 2) {
constrains.gridx = 0;
constrains.gridy = i;
JLabel blindYLabel = new JLabel(" ");
blindYLabel.setBorder(emtyborder);
blindYLabel.setBackground(Color.black);
blindYLabel.setEnabled(false);
// blind.setPreferredSize(new Dimension(30,25));
if (i > 0) {
if (i % 2 == 0) {
blindYLabel.setPreferredSize(new Dimension(30, 5));
blindYLabel.setMaximumSize(blindYLabel.getPreferredSize());
blindYLabel.setBackground(Color.black);
} else {
blindYLabel.setPreferredSize(new Dimension(30, 5));
blindYLabel.setMaximumSize(blindYLabel.getPreferredSize());
blindYLabel.setBackground(Color.white);
}
}
blindYLabel.setOpaque(true);
anchorPanel.add(blindYLabel, constrains);
}
//
// define basic grid count of Label + gap + field + gap + unit + gap ...
//
int cols = 6;
for (int i = 0; i <= cols; i++) {
constrains.gridx = i;
constrains.gridy = 0;
JLabel blindXLabel = new JLabel(" ");
blindXLabel.setBorder(emtyborder);
blindXLabel.setBackground(Color.black);
blindXLabel.setEnabled(false);
blindXLabel.setPreferredSize(new Dimension(30, 25));
blindXLabel.setOpaque(true);
anchorPanel.add(blindXLabel, constrains);
}
//
GridBagConstraints constrain = new GridBagConstraints();
for (int r = 0; r <= rows; r++) {
for (int c = 0; c <= cols; c++) {
if (c == 1 || c == 5) {
constrain.gridx = c;
constrain.gridy = r + 1;
constrain.anchor = GridBagConstraints.WEST;
JButton button = new JButton(" button " + r + c);
anchorPanel.add(button, constrain);
}
}
}
//
GridBagConstraints txtconstrains = new GridBagConstraints();
//
txtconstrains.weighty = 1;
//
for (int r = 0; r <= rows; r++) {
for (int c = 0; c <= cols; c++) {
if (c == 3) {
txtconstrains.gridx = c;
txtconstrains.gridy = r + 1;
txtconstrains.anchor = GridBagConstraints.WEST;
String text = "text " + r + c;
JTextArea txtfld = new JTextArea(text);
JPanel dummypanel = new JPanel();
JScrollPane txtfld_scroll = new JScrollPane(txtfld);
txtfld_scroll.add(txtfld);
dummypanel.add(txtfld_scroll, txtconstrains);
//
txtfld_scroll.setHorizontalScrollBarPolicy(txtfld_scroll.HORIZONTAL_SCROLLBAR_AS_NEEDED);
txtfld_scroll.setVerticalScrollBarPolicy(txtfld_scroll.VERTICAL_SCROLLBAR_AS_NEEDED);
//
Dimension txtdim = new Dimension();
txtdim.width = 330;
txtdim.height = 20; // alt 32
txtfld.setSize(txtdim);
txtfld.setPreferredSize(txtdim);
txtfld.setMinimumSize(dummypanel.getPreferredSize());
txtfld.addFocusListener(new GridFieldListener(anchorPanel, txtconstrains));
anchorPanel.add(txtfld, txtconstrains);
// anchorPanel.add(txtfld_scroll, txtconstrains);
}
}
}
}
}
第二个文件
code
package Dynamicgridbag;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import java.beans.*;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
//public class GridFieldListener implements PropertyChangeListener, Runnable
public class GridFieldListener implements FocusListener, Runnable {
private String oldValue = "";
private String newValue = "";
private Object gridfield = null;
private JPanel panel = null;
private GridBagConstraints gbc = null;
public GridFieldListener(JPanel panel, GridBagConstraints gbc) {
this.panel = panel;
this.gridfield = gridfield;
this.gbc = gbc;
}
public GridFieldListener() {
}
@Override
public void run() {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
System.out.println("buildGridUnit focusGained FocusEvent: " + e);
gridfield = e.getComponent();
gridfield = e.getSource();
System.out.println("focusGained focusGained e.getSource(): " + e.getSource());
//
if (gridfield instanceof JTextArea) {
JTextArea txtarea = (JTextArea) gridfield;
System.out.println("focusGained focusGained txtarea: " + txtarea);
Dimension olddim = txtarea.getSize();
System.out.println("focusGained focusGained olddim: " + olddim);
double oldheigh = olddim.getHeight();
double oldwidth = olddim.getWidth();
double newheigh = oldheigh * 4;
double newwidth = oldwidth;
Dimension newdim = new Dimension();
newdim.setSize(newwidth, newheigh);
System.out.println("focusGained focusGained newdim: " + newdim);
txtarea.setSize(newdim);
txtarea.setPreferredSize(newdim);
//
txtarea.setText(txtarea.getText());
//
// panel.repaint();
txtarea.repaint();
}
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("buildGridUnit focusLost FocusEvent: " + e);
//
if (gridfield instanceof JTextArea) {
JTextArea txtarea = (JTextArea) gridfield;
Dimension olddim = txtarea.getSize();
System.out.println("focusGained focusGained olddim: " + olddim);
double oldheigh = olddim.getHeight();
double oldwidth = olddim.getWidth();
double newheigh = oldheigh / 4;
double newwidth = oldwidth;
Dimension newdim = new Dimension();
newdim.setSize(newwidth, newheigh);
System.out.println("focusGained focusGained newdim: " + newdim);
txtarea.setSize(newdim);
txtarea.setPreferredSize(newdim);
txtarea.repaint();
}
}
}