5

Swing で StyledEditorKit を拡張して、エディター内に JLabel を含めることができるようにしようとしています。私はそれをすることができました、そしてこれは私がこれまでに得たものです. 下の画像では、強調表示されたテキストボタンは JLabel タイプですが、残りのテキストは通常​​のテキストです。

ここに画像の説明を入力

ご覧のとおり、ラベルは通常のテキストよりも少し下に表示されます。その上部を残りのテキストの上部に揃えるにはどうすればよいですか?

このラベル要素を作成するために使用されるビューのコードは次のとおりです。

class ComponentView(Element elem) {
      @Override
      protected Component createComponent() {
        JLabel lbl = new JLabel("");
        lbl.setOpaque(true);
        lbl.setBackground(Color.red);
        try {
               int start = getElement().getStartOffset();
               int end = getElement().getEndOffset();
               String text = getElement().getDocument().getText(start, end - start);
               lbl.setText(text);
         } catch (BadLocationException e) {}
         return lbl;
       }
}
4

1 に答える 1

5

ComponentViewComponent.getAlignmentYで提案されているように、テキストのベースラインに対するコンポーネントの位置を制御する調整を試してください。

JTextPane組み込みコンポーネントをより簡単にサポートする を使用することもできます。コンポーネントは、 insertComponent()メソッドを使用して追加できます。これは例であり、デモも行いますsetAlignmentY

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class TextPaneDemo {
    private static void createAndShowGUI() {
        final JTextPane pane = new JTextPane();
        pane.setText("Some text");

        JButton buttonButton = new JButton("Insert label");
        buttonButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                JLabel label = new JLabel("label");
                label.setAlignmentY(0.85f);
                pane.insertComponent(label);
            }
        });

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(buttonButton, BorderLayout.SOUTH);
        panel.add(pane, BorderLayout.CENTER);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2012-08-28T02:59:04.007 に答える