2

![ここに画像の説明を入力してください][1]私は次の構造を持っています

JFrame
  JPanel
    JScrollPane
      class that extends JTextPane

長いテキストを追加した後、JScrollPaneはJTextPaneを非表示にします。

グリッドバッグレイアウトを使用しています。

JTextPaneを拡張するclss内にDefaultStyledDocumentがあります。

JTextPaneの最大サイズを設定しました

text.setMaximumSize(new Dimension(100,50)); 

パッケージcom.example;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;

public class Test extends JFrame{

    IPanel p;
    public Test() {
        p = new IPanel();
        p.init();
        setTitle("Test");
        setBounds(50, 50, 200, 200);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(p);
        setVisible(true);
    }

    public static void main(String[] args) {
        Test t = new Test();
    }

}
class IPanel extends JPanel{
    public void init() {
        GridBagConstraints gbc = new GridBagConstraints();
        GridBagLayout gridbag = new GridBagLayout();
        JLabel subjectLabel = new JLabel("Text");
        gbc.weighty = 0.0;
        gbc.gridwidth = 1;
        gbc.weightx = 0.0;
        gbc.anchor = GridBagConstraints.NORTH;
        gridbag.setConstraints(subjectLabel, gbc);
        add(subjectLabel);

        TextPane Text = new TextPane(255);
        Text.setMaximumSize(new Dimension(100,20));
        Text.setPreferredSize(new Dimension(100,20));
        gridbag.setConstraints(Text, gbc);
        JScrollPane subScrollPane = new JScrollPane(Text);
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        gbc.weighty = 0.0;
        gbc.insets = new Insets(0, 0, 5, 0);
        gridbag.setConstraints(subScrollPane, gbc);
        subScrollPane.setWheelScrollingEnabled(false);
        add(subScrollPane);
    }
}
class TextPane extends JTextPane{
    private Doc doc = new Doc();
    public TextPane(int lenght) {
        doc.setmaxLength(lenght);
    }
}
class Doc extends DefaultStyledDocument{
    private int maxLength = 0;
    public void setmaxLength(int lenght) {
        maxLength = lenght;
    }
}

これはコード例です

4

2 に答える 2

3

EmptyBorderを使用するだけです。代わりに何ができるかについて、この例を見てください。

import java.awt.*;
import javax.swing.*;

public class ScrollPaneExample
{
    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("JScrollPane Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));
        JTextPane textPane = new JTextPane();
        textPane.setText("IF this is a very large text" + 
                            " still it can manage that" + 
                            " without any difficulty since" +
                            " it knows how to handle itself.");
        textPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));                    

        JScrollPane scroller = new JScrollPane();                   
        scroller.setViewportView(textPane);
        contentPane.add(scroller);

        frame.setContentPane(contentPane);
        frame.setSize(100, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ScrollPaneExample().createAndDisplayGUI();
            }
        });
    }
}
于 2012-06-28T12:51:46.540 に答える
2

これは、まったく同じ階層、同じレイアウト、すべて問題のない例です。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class Test3 {

    protected static void initUI() {
        JFrame frame = new JFrame("Test text pane");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextPane text = new JTextPane();
        text.setText(LONG_TEXT);
        JScrollPane scrollPane = new JScrollPane(text);
        JPanel panel = new JPanel(new GridBagLayout());
        panel.add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
                0, 0, 0, 0), 0, 0));
        frame.add(panel);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initUI();
            }
        });
    }

    private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In molestie purus vel ipsum commodo id bibendum est porta. Proin leo nisl, facilisis eu euismod eget, fermentum a lacus. Nulla pulvinar ante at elit tristique condimentum. Suspendisse ac erat eu lectus vulputate sagittis sed a urna. In diam ligula, blandit id scelerisque sit amet, porttitor in libero. Curabitur in rhoncus tellus. Aenean dignissim dui semper ante pharetra interdum scelerisque vel tortor. Vestibulum id arcu mauris. Integer ut magna purus. Mauris orci massa, porta sollicitudin rutrum eu, ultrices non leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sem justo, dapibus in euismod et, gravida sit amet eros.\r\n"
            + "\r\n"
            + "Suspendisse id ligula sit amet neque euismod commodo in at massa. Sed pretium lobortis vulputate. Aliquam non eros odio, non accumsan nisi. Phasellus vel nisl tellus, quis tincidunt risus. Donec ut nulla felis. Morbi sit amet enim arcu. Integer iaculis mi id sem vulputate non lacinia dui dictum.\r\n"
            + "\r\n"
            + "Praesent luctus neque in purus convallis vel aliquet dui rutrum. In lobortis nisl eu nisi tincidunt adipiscing sodales sapien sodales. Morbi augue massa, dictum vel hendrerit vel, tincidunt id lectus. Proin vulputate nunc placerat ante fringilla vitae ullamcorper mauris fringilla. Duis et massa sapien. Integer porta elementum enim in lobortis. Morbi eget mi nunc. Quisque nec arcu eget orci elementum consectetur ut in metus.\r\n"
            + "\r\n"
            + "Donec iaculis felis vel felis rutrum id congue tellus aliquet. Ut vel sapien mauris, quis sodales odio. Aliquam cursus urna a leo lacinia eget porttitor ante mattis. Aenean dictum, tellus in volutpat luctus, magna eros feugiat tortor, nec lobortis diam justo vel est. Praesent sit amet nisl sed eros semper ultrices. Nunc lobortis scelerisque sapien, ac sodales nibh viverra ac. Etiam auctor, odio ut venenatis hendrerit, odio ipsum sollicitudin libero, non adipiscing nisi eros at nulla. Nulla consequat arcu in libero pellentesque sit amet aliquet arcu elementum. Nulla facilisi. Proin sodales neque quis turpis gravida ac mollis ipsum ultricies. Mauris lorem magna, ultricies a dignissim sit amet, egestas et neque. Phasellus iaculis pellentesque ultrices. Phasellus a consectetur nisl. Proin ac quam id lectus dignissim lacinia. Praesent ligula purus, mattis eu pellentesque nec, convallis id lorem.\r\n"
            + "\r\n"
            + "Cras at sapien vitae felis fermentum consectetur sed eu justo. Mauris in felis mi. Vestibulum felis neque, varius at aliquet non, ornare at eros. In hac habitasse platea dictumst. Vivamus placerat, tellus laoreet pulvinar tempor, velit elit aliquet diam, eu ullamcorper purus enim non lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam et enim magna. Ut varius, lectus at luctus laoreet, urna mauris euismod velit, vitae sodales nulla nulla non sem. Phasellus eget viverra erat. Phasellus quam ante, vehicula sed tristique vestibulum, ullamcorper et nunc. Phasellus placerat congue tellus, condimentum volutpat ligula convallis fringilla. Curabitur quis nibh lorem, ut feugiat velit. Aliquam vehicula pellentesque aliquet. ";
}

編集:

これらの2行のコードには問題があります。

Text.setMaximumSize(new Dimension(100, 20));
Text.setPreferredSize(new Dimension(100, 20));

JTextPaneの優先サイズと最大サイズを強制します。非常に厳しい制約を提供しています。通常、スクロールバーの幅/高さは約20ピクセルです。つまり、水平スクロールバーが表示されると、コンポーネントの高さの大部分を占めます。

また、コードの次の間違いにも注意してください。

  1. メソッドでGridBagLayoutを宣言しますが、init()(を使用して)パネルに設定しません。これは、実際にレイアウトを実行しているsetLayoutことを意味します。FlowLayout
  2. テキストペインにGBCを設定していますが、テキストペインをパネルに追加せず、スクロールペインを追加するため、これらの制約を設定してもレイアウトには影響しません。

あなたが何を達成しようとしているのかわかりません。私には、単純なもので十分であるように見えJTextFieldますが、知るのに十分なコンテキストがありません。

EDIT2:

  1. IPanelのレイアウトをgridbag、init()メソッドで作成したものに設定します。
  2. スクロールペイン制約に次の制約ヒントを追加します。

    gbc.fill = GridBagConstraints.BOTH;
    gbc.weighty = 1.0;
    
于 2012-06-28T12:54:17.253 に答える