3

私は持っていますJTextField textFieldそして私は恣意的ですString string

テキストフィールドに文字列の終わりを表示したいのですが、収まらないものを切り取り、代わりに「...」を使用します。たとえば、文字列が次の場合"Hello How Are You Doing"、テキストフィールドは次のようになります。

...re You Doing

与えられtextfieldstring、どうすればこれを行うことができますか?

更新:これを実行したい理由は、ファイルチューザーであるため、ファイルの終わりを優先して表示したいからです。たとえば、ユーザーが/Users/Name/Documents/Folder1/Folder2/Folder3/file.txtに保存することを選択した場合、最後を表示したいので、収まらない残りは「...」に置き換える必要があります。

これが行われる場所です:

JFileChooser chooser = new JFileChooser();
int response = chooser.showSaveDialog(this);
if(response == JFileChooser.APPROVE_OPTION) {
    File file = chooser.getSelectedFile();
    String string = file.getAbsolutePath();

    fileTextField.setText(/* here's where the code would go */);
}
4

3 に答える 3

5

..ファイルチューザーなので、ファイルの終わりを優先して表示したいと思います。

別の方法としてこれを提案するか、ファイル名の後にツールチップ(パス)をドロップします。

FileListName

import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

class FileListName {

    final class FileListCellRenderer extends DefaultListCellRenderer {

        private FileSystemView fsv = FileSystemView.getFileSystemView();

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            JLabel l = (JLabel) c;
            File f = (File) value;
            l.setText(f.getName());
            l.setIcon(fsv.getSystemIcon(f));
            l.setToolTipText(f.getAbsolutePath());

            return l;
        }
    }

    public FileListName() {
        JFileChooser jfc = new JFileChooser();
        jfc.showOpenDialog(null);
        if (jfc.getSelectedFile() != null) {
            File[] f = {jfc.getSelectedFile()};
            JList list = new JList(f);
            list.setVisibleRowCount(1);
            list.setCellRenderer(new FileListCellRenderer());
            JOptionPane.showMessageDialog(null, list);
        }
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                try {
                    // Provides better icons from the FSV.
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                new FileListName();
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
于 2013-01-07T03:55:58.530 に答える
3

String#lengthあなたが直面する問題は、ピクセル幅と一致しないという事実です。現在のフォント、コンポーネントの幅、アイコン、アイコンの間隔、インセット、画面の DPI を考慮する必要があります.... :P

ここに画像の説明を入力

public class TrimPath {

    public static void main(String[] args) {
        new TrimPath();
    }

    public TrimPath() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());

                File path = new File("C:\\Users\\Default\\AppData\\Local\\Microsoft\\Windows\\GameExplorer");
                TrimmedLabel label = new TrimmedLabel(path.getPath());
                label.setIcon(FileSystemView.getFileSystemView().getSystemIcon(path));

                frame.add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TrimmedLabel extends JLabel {

        private String masterText;

        public TrimmedLabel(String text) {
            super(text);
        }

        @Override
        public void setText(String text) {
            if (masterText == null ? text != null : !masterText.equals(text)) {
                masterText = text;
                super.setText(text);
            }
        }

        @Override
        public String getText() {

            String text = getMasterText();

            if (text != null && text.length() > 0) {
                int width = getWidth();
                Icon icon = getIcon();
                if (icon != null) {
                    width -= (icon.getIconWidth() + getIconTextGap());
                }
                FontMetrics fm = getFontMetrics(getFont());
                if (width > 0 && fm != null) {
                    int strWidth = fm.stringWidth(text);
                    if (strWidth > width) {
                        StringBuilder sb = new StringBuilder(text);
                        String prefix = "...";
                        while (fm.stringWidth(prefix + sb.toString()) > width) {
                            sb.delete(0, 1);
                        }
                        text = prefix + sb.toString();
                    }
                }
            }
            return text;
        }

        public String getMasterText() {
            return masterText;
        }
    }
}
于 2013-01-07T05:29:19.443 に答える
0

独自のドキュメントを設定することで実行できます

(これは簡単で汚いので、何度もテストしてください)

final int CHAR_DISPLAY_MAX = 10;
final int REPLACE_NUMBER = 3;
final JTextField tf = new JTextField(7);
Document doc = new PlainDocument(){
  public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{
    if (this.getLength() + str.length() > CHAR_DISPLAY_MAX)
    {
      String oldText = tf.getText();
      String newText = oldText+str;
      tf.setText("..."+newText.substring(newText.length() - (CHAR_DISPLAY_MAX-REPLACE_NUMBER)));
      return;
    }
    super.insertString(offs, str, a);
  }
};
tf.setDocument(doc);
于 2013-01-07T04:54:42.827 に答える