Изменение подходящего выравнивания заголовков столбцов?

Я обновляю свой общий графический интерфейс для обработки данных и подумал, что буду использовать uitable вместо списка uicontrol для отображения пути (ов) и имени (имен) загруженных файлов. Я заметил, что заголовки столбцов по умолчанию центрированы, и я не могу понять, как выровнять их по левому краю, если имя файла длиннее ширины таблицы. Я проверил свойства, возвращенные get, и покопался с findjobj, но не нашел ничего очевидного. Моя попытка использовать html-строку также не увенчалась успехом.

Я упускаю что-то очевидное?

Образец кода:

function testcode
res = get(0,'ScreenSize');
figdim = [1280 720]; % Main figure size, pixels
handles.mainfig = figure( ...
    'Units', 'Pixels', ...
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
    'Name', 'Meep', ...
    'Resize', 'off', ...
    'DockControls', 'off', ...
    'NumberTitle', 'off', ...
    'Toolbar', 'figure' ...
    );
handles.filetable = uitable( ...
    'Parent', handles.mainfig, ...
    'Units', 'normalized', ...
    'Position', [0.038 0.71 0.235 0.1], ...
    'ColumnName', 'File Loaded', ...
    'Data', {'None'} ...
    );
handles.loadfilebtn = uicontrol( ...
    'Parent', handles.mainfig, ...
    'Style', 'pushbutton', ...
    'Units', 'normalized', ...
    'Position', [0.075 0.85 0.16 0.07], ...
    'String', 'This is a Button, Click', ...
    'Callback', {@abutton} ...
    );
guidata(handles.mainfig, handles);
end
function abutton(hObject,~)
handles = guidata(hObject);

filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension';
set(handles.filetable,'Data',{filepath});
set(handles.filetable,'ColumnWidth',{length(filepath)*5});

test = '<html><left />File Loaded</html>';
set(handles.filetable,'ColumnName',test); % Attempt #1, doesn't work
end

person excaza    schedule 09.09.2014    source источник
comment
Я не могу вспомнить, когда я видел такой хороший работающий минимальный пример кода для вопроса графического интерфейса! +1   -  person thewaywewalk    schedule 09.09.2014


Ответы (2)


Самый простой обходной путь, который я мог придумать, - это разделить таблицу и заголовок таблицы на два отдельных uitables. Немного затруднительно правильно установить векторы положения, но в целом это работает как шарм. Важно: поместите "header-uitable" ниже (сначала в коде) "data-table". Таким образом вы избавите себя от некоторых проблем.

function testcode
close all
res = get(0,'ScreenSize');
figdim = [1280 720]; % Main figure size, pixels
handles.mainfig = figure( ...
    'Units', 'Pixels', ...
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
    'Name', 'Meep', ...
    'Resize', 'off', ...
    'DockControls', 'off', ...
    'NumberTitle', 'off', ...
    'Toolbar', 'figure' ...
    );
handles.tableheader = uitable( ...
    'Parent', handles.mainfig, ...
    'Units', 'normalized', ...
    'Position', [0.038 0.71 0.235 0.1], ...
    'ColumnName', 'File Loaded', ...
    'ColumnWidth', {271} ...
    );
handles.filetable = uitable( ...
    'Parent', handles.mainfig, ...
    'Units', 'normalized', ...
    'Position', [0.038 0.682 0.235 0.1], ...
    'ColumnName', {}, ...
    'Data', {'None'} ...
    );
handles.loadfilebtn = uicontrol( ...
    'Parent', handles.mainfig, ...
    'Style', 'pushbutton', ...
    'Units', 'normalized', ...
    'Position', [0.075 0.85 0.16 0.07], ...
    'String', 'This is a Button, Click', ...
    'Callback', {@abutton} ...
    );
guidata(handles.mainfig, handles);
end
function abutton(hObject,~)
handles = guidata(hObject);

filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension';
set(handles.filetable,'Data',{filepath});
set(handles.filetable,'ColumnWidth',{length(filepath)*5});

end

введите здесь описание изображения

person thewaywewalk    schedule 09.09.2014

Вы упомянули findjobj, который позволяет получить JTable объект за вашим столом. На самом деле вы пытаетесь изменить некоторые свойства заголовок или JTableHeader объект. Как только вы узнаете, что ищете, решение будет легко найти (например, этот предыдущий поток ).

Таким образом, поместите этот код в конец обратного вызова кнопки:

function abutton(hObject,~)
%// ....

hTable = handles.filetable;
jScrollpane = findjobj(hTable);
jTable = jScrollpane.getComponent(0).getComponent(0);
%// You can see the list of components using findjobj(hTable).list
%// Part1:
dtcr = javaObject('javax.swing.table.DefaultTableCellRenderer');
dtcr.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
jTable.getColumn(jTable.getColumnName(0)).setHeaderRenderer(dtcr);
%// Part2:
jRenderer = jTable.getTableHeader().getDefaultRenderer();
jRenderer.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
%// Finalization:
jTable.invalidate();

end

Нажатие кнопки затем приводит к:

...желаемый результат

Несколько примечаний:

  1. Вот документация по SwingConstants.
  2. Два Parts должны быть двумя разными решениями, но я заметил, что это работает только в том случае, если присутствуют оба (у меня нет объяснения этому).
  3. Я попытался установить это в функции создания фигур, но это не сработало (у меня тоже нет объяснения этому).
  4. Протестировано на MATLAB 2014a.
person Dev-iL    schedule 09.09.2014
comment
Хотя мне нравится этот java-подход, у этого решения есть большой недостаток: если вы прокрутите вправо, заголовок исчезнет. - person thewaywewalk; 09.09.2014
comment
Хотел бы я принять оба ответа. Я надеялся найти использование существующего объекта, но @thewaywewalk поднимает хороший вопрос. Основной мотивацией для этого является сделать интерфейс более визуально привлекательным, а другой ответ, хотя и довольно хакерский, лучше достигает цели. Спасибо вам обоим :) - person excaza; 09.09.2014
comment
@thewaywewalk - я с тобой согласен. Это то, что я понял, чего хотел ОП (надеюсь, после рассмотрения возможных альтернатив и недостатков). - person Dev-iL; 09.09.2014