1

それが私が達成したいことです:

ここに画像の説明を入力

ご覧のとおり、水平スクロールが変更され、同じ行に JLabel("text") が追加されます。現在、水平スクロールを(画像のように)変更する方法を見つけましたが、画像に配置されている場所に JLabel("text") を追加する方法が見つかりません。

助言がありますか?前もって感謝します!

import java.awt.Component;
import java.awt.Container;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneLayout;
import javax.swing.WindowConstants;

public class Test {

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(300, 300);

        JPanel myPanel = new JPanel();
        myPanel.add(new JLabel("Check Check Check Check Check Check Check Check"));
        MyScrollPane scrollPane = new MyScrollPane(myPanel);

        jFrame.add(scrollPane);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

}

class MyScrollPane extends JScrollPane {

    JLabel label = new JLabel("text");

    public MyScrollPane(Component view) {
        super(view, VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS);
        this.setLayout(new MyLayout(label));
        add(label);
    }
}

class MyLayout extends ScrollPaneLayout {

    JLabel label;

    public MyLayout(JLabel aLabel) {
        super();
        label = aLabel;
    }

    public void layoutContainer(Container parent) {
        super.layoutContainer(parent);

        hsb.setSize(hsb.getWidth() - 100, hsb.getHeight()); // drift
        Point location = hsb.getLocation();
        label.setLocation(location.x + 12, location.y - 12);
    }
}
4

3 に答える 3

3

JScrollPane の独自の実装を検討することをお勧めします。恐ろしく聞こえるかもしれませんが、本質的にすべての JScrollPane は 2 つの JScrollBars と g.translate() を呼び出すいくつかのグラフィックス ロジックです。

独自のコンポーネントを作成する利点は、レイアウト、表示、およびイベントを完全に制御できることです。これは、私があなたの立場だったらとる道です。

于 2012-04-25T20:33:10.433 に答える
2

これが私の試みです:

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

public class Test2 {
  public JComponent makeUI() {
    JPanel myPanel = new JPanel();
    myPanel.add(new JLabel("Check Check Check Check Check Check Check Check"));
    JScrollPane scrollPane = new JScrollPane(myPanel,
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    JScrollBar hsb = scrollPane.getHorizontalScrollBar();
    hsb.setBorder(new StringBorder(hsb, "Test"));
    JPanel p = new JPanel(new BorderLayout());
    p.add(scrollPane);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new Test2().makeUI());
    f.setSize(300, 300);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
class StringBorder implements Border {
  private final JComponent parent;
  private final Insets insets;
  private final Rectangle rect;
  private final String str;
  public StringBorder(JComponent parent, String str) {
    this.parent = parent;
    this.str = str;
    FontRenderContext frc = new FontRenderContext(null, true, true);
    rect = parent.getFont().getStringBounds(str, frc).getBounds();
    rect.width = Math.max(rect.width, 100);
    insets = new Insets(0,5,0,rect.width);
  }
  @Override public Insets getBorderInsets(Component c) {
    return insets;
  }
  @Override public boolean isBorderOpaque() {
    return false;
  }
  @Override public void paintBorder(
      Component c, Graphics g, int x, int y, int width, int height) {
    Graphics2D g2 = (Graphics2D)g;
    float tx = x + width - insets.right + insets.left;
    float ty = y - rect.y + (height - rect.height)/2;
    g2.setPaint(Color.BLACK);
    g2.drawString(str, tx, ty);
  }
}
于 2012-04-26T08:11:57.807 に答える