Срещнах следния проблем в моята програма. Имам JPanel с GridBagLayout в рамките на JScrollPanel. Трябва да има следното поведение:
- Превъртането трябва да е възможно само вертикално.
- В JPanel редовете се добавят динамично. Тези редове имат две колони. И двете колони трябва да разделят пространството по равно.
- Всяко поле (колона/ред) на тази таблица е JTextPane, тъй като текстът може да се редактира и може да показва HTML. Ако текстът е твърде дълъг, той ще бъде обвит с ефекта, че височината на полето нараства.
- При преоразмеряване на прозореца се преоразмеряват и колоните.
Проблемът е, когато има дълъг текст:
- Когато използвате JTextPane без PreferredSize, обвиването не работи и колоните не са разделени по равно. Задавайки Предпочитан размер, JTextPane изрязва текста във втория ред. JEditorPane също не работи.
- Когато използвате JTextArea с активирано обвиване, тогава работи! Въпреки това не мога да покажа HTML. Освен това четвъртата точка не е изпълнена. При разширяване на прозореца полето също се преоразмерява. Но когато отново намалявате прозореца, той не се преоразмерява обратно.
Как мога да постигна желаното поведение и да избегна тези проблеми? Вече изчерпах всички възможности, за които се сещам.
Ето снимка на желаното поведение при използване на JTextPanes
(но без HTML):
Ето грешното поведение при използване на JTextPanes
:
И ето код за SSCCE:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
public class EditorTest extends JFrame {
private JPanel jPanel1;
private JPanel jPanel2;
private JScrollPane jScrollPane1;
private JTextPane jTextPane1;
private JTextPane jTextPane2;
public EditorTest() {
initComponents();
}
private void initComponents() {
GridBagConstraints gridBagConstraints;
jScrollPane1 = new JScrollPane();
jPanel2 = new JPanel();
jPanel1 = new JPanel();
jTextPane2 = new JTextPane();
jTextPane1 = new JTextPane();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(500, 500));
getContentPane().setLayout(new GridBagLayout());
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jPanel2.setBorder(BorderFactory.createEmptyBorder());
jPanel2.setLayout(new BorderLayout());
jPanel1.setLayout(new GridBagLayout());
jTextPane2.setContentType("text/html");
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new Insets(0, 0, 3, 3);
jPanel1.add(jTextPane2, gridBagConstraints);
jTextPane1.setContentType("text/html");
jTextPane1.setText("This is a very long text that also sometimes is "
+ "<span style=\"color:blue\">blue</span> and so on and so on.");
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new Insets(0, 0, 3, 3);
jPanel1.add(jTextPane1, gridBagConstraints);
jPanel2.add(jPanel1, BorderLayout.NORTH);
jScrollPane1.setViewportView(jPanel2);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
getContentPane().add(jScrollPane1, gridBagConstraints);
pack();
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new EditorTest().setVisible(true);
}
});
}
}
Благодаря ви много за вашата помощ!
АКТУАЛИЗАЦИЯ1
За да направя желаното поведение по-ясно, създадох друга екранна снимка с JTextArea
, както на първата снимка отгоре. Текстовите панели трябва да са в горната част и само толкова високо, колкото е необходимо (т.е. текстът). За да илюстрирате това поведение, промените и фона на текстовото поле.
setMaximumSize()
няма ефект. Въпреки това, като зададетеgetPreferredSize()
с параметрите, които предлагате, ширината се показва правилно, но височината запълва целия прозорец. Може би това е много близо! Имате ли друга идея как да регулирам височината сега? - person Rolch2015   schedule 25.03.2015